`

C++ 中调用其他应用程序的方法

阅读更多

三个SDK函数 WinExecShellExecuteCreateProcess 实现调用其他程序的方法

三个SDK函数: WinExec, ShellExecute,CreateProcess 可以实现调用其他程序的要求,其中以WinExec最为简单,ShellExecute比WinExec灵活一些,CreateProcess最为复杂。

WinExec 两个参数,前一个指定路径,后一个指定显示方式。
ShellExecute 可以指定工作目录,并且还可以寻找文件的关联直接打开不用加载与文件关联的应用程序,ShellExecute还可以打开网页,启动相应的邮件关联发送邮件等等。
CreateProcess 一共有十个参数,不过大部分都可以用NULL代替,它可以指定进程的安全属性,继承信息,类的优先级等等。如果我们要得到足够多的关于新的进程的信息,控制新的进程的细节属性,若要达到这些目的,我们就需要使用CreateProcess函数了。

三个SDK函数( WinExec、ShellExec、CrateProcess )的语法:

WinExec

这个函数最简单,只有两个参数,原型如下:
UINT WinExec(
LPCSTR lpCmdLine, // 命令路径
UINT uCmdShow // 显示方式
);


使用方法如下:
WinExec("Notepad.exe", SW_SHOW); // 打开记事本
WinExec("D:Program FilesTestTest.exe",SW_SHOWMAXIMIZED); // 以最大化的方式打开Test.exe
需要注意的是若用 SW_SHOWMAXMIZED 方式去加载一个无最大化按钮的程序,譬如Neterm,Calc 等等,就不会出现正常的 窗体,但是已经被加到任务列表里了。

ShellExecute

原型如下:
HINSTANCE ShellExecute(
HWND hwnd, //父窗口句柄
LPCTSTR lpOperation, //操作, 打开方式 "edit","explore","open","find","print","NULL"
LPCTSTR lpFile, //文件名,前面可加路径
LPCTSTR lpParameters, //参数
LPCTSTR lpDirectory, //默认文件夹
INT nShowCmd //显示方式
);


使用方法如下:
ShellExecute(NULL,"open","C:Test.txt",NULL,NULL,SW_SHOWNORMAL); // 打开C:Test.txt 文件
ShellExecute(NULL, "open", "http://www.google.com", NULL, NULL, SW_SHOWNORMAL); // 打开网页www.google.com
ShellExecute(NULL,"explore", "D:C++",NULL,NULL,SW_SHOWNORMAL); // 打开目录D:C++
ShellExecute(NULL,"print","C:Test.txt",NULL,NULL, SW_HIDE); // 打印文件C:Test.txt
ShellExecute不支持定向输出。

CreateProcess

原型如下:
BOOL CreateProcess(
LPCTSTR lpApplicationName, //执行程序名
LPTSTR lpCommandLine, // 参数行
//下面两个参数描述了所创建的进程和线程的安全属性,如果为NULL则使用默认的安全属性
LPSECURITY_ATTRIBUTES lpProcessAttributes, // process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes, // thread security attributes
BOOL bInheritHandles, // 继承标志
DWORD dwCreationFlags, // 创建标志
LPVOID lpEnvironment, // 环境变量
LPCTSTR lpCurrentDirectory, // 运行该进程的初始目录
LPSTARTUPINFO lpStartupInfo, // 用于在创建子进程时设置各种属性
LPPROCESS_INFORMATION lpProcessInformation //用于在进程创建后接受相关信息
);


使用方法如下:
PROCESS_INFORMATION pi;
STARTUPINFO si;
memset(&si,0,sizeof(si));
si.cb=sizeof(si);
si.wShowWindow=SW_SHOW;
si.dwFlags=STARTF_USESHOWWINDOW;
bool fRet=CreateProcess("D:putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);

可以看出,通过上面的几个不同的方法,都可以实现在应用程序中打开其他应用程序的目的,其中有些方法可能会麻烦一点,所以就需要我们根据不同的目的去选择最适合自己的方法去实现自己的目的!


关于三个SDK函数: WinExec, ShellExecute,CreateProcess 的其他注意事项:

1、定义头文件
在头文件stdafx.h中必须定义以下两个头文件:
#include <shlobj.h> // 可替换为 windows.h
#include <shellapi.h>
如果定义了头文件 #include 的话就不必定义 #include 了,"windows.h" 不光是包含了"shellapi.h",它还定义了许多数据类型,如果没有这些数据类型,shellapi.h本身会出错。

2、定义路径
C++中所表示的路径要用 " "而不是平常所用的" ",所以以上三个函数表示路径都为:
Disk:Directory...File name
WinExec("D:Program FilesTestTest.exe",SW_SHOWMAXIMIZED);
ShellExecute(NULL,"open","C:Test.txt",NULL,NULL,SW_SHOWNORMAL);
bool fRet=CreateProcess("D:putty.exe",NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&si,&pi);

本文所有程序在 Visual Studio.Net 2003 C++ 环境下编写,编译过程没有错误。
测试环境:
Windows XP Home Edition
Visual Studio.Net 2003

分享到:
评论

相关推荐

    C++ QT调用外部程序(QProcess)

    总之,`QProcess`是C++ Qt框架中一个功能强大且灵活的工具,它使开发者能够轻松地在应用程序中集成外部程序,进行进程间通信,并处理相关结果。理解并熟练运用`QProcess`,可以极大地扩展Qt应用程序的功能和灵活性。...

    C++调用Web services的控制台应用程序

    本项目"**C++调用Web services的控制台应用程序**"正是这样一个示例,它展示了如何在C++环境下创建一个能调用Web服务的简单命令行应用。 首先,我们要理解Web服务的本质。Web服务是一种基于HTTP协议,使用XML(可...

    C++调用C#的DLL实例程序

    这些方法需要使用.NET Framework的特性进行标记,以便其他.NET应用程序能够识别和调用。 接着,让我们转向C++。由于C++并不直接支持.NET框架,因此调用C#的DLL需要使用C++/CLI(Managed C++),这是一种扩展的C++...

    c++ 类的互相调用的方法

    在一个类的成员函数中,可以直接调用本类的其他成员函数,也可以通过对象或指针间接调用其他类的成员函数。例如,我们有`ClassA`和`ClassB`两个类,`ClassA`中有一个成员函数`funcA()`,`ClassB`中有一个成员函数`...

    c++调用jar包

    标题 "c++调用jar包" 涉及的关键技术是C++程序如何与Java的jar包进行交互。在描述中提到,这是一个C++编写的动态库,它能够调用...在实际应用中,这可以用于利用Java的特定库或服务,同时保持C++应用程序的性能优势。

    在C或C++中调用JAVA方法

    在JNI编程中,首先要有一个Java类,该类包含将被C/C++调用的方法。例如,我们可以创建一个名为`Demo`的Java类,包含静态和非静态方法,属性,数组,以及异常处理。以下是一个简单的`Demo`类示例: ```java package ...

    C++与js相互调用

    MFC(Microsoft Foundation Classes)是微软提供的一套Windows应用程序开发框架。在MFC应用中集成JavaScript调用,可以使用ActiveX控件或JScript运行时。ActiveX控件可以让JavaScript调用MFC中的C++函数,而JScript...

    C++调用Android函数工程

    JNI是Java平台的一部分,它为Java应用程序提供了一种方式来实现本地方法,这些方法可以由C、C++等本地代码编写。在Android中,我们通常使用JNI来实现高性能计算或者调用操作系统级别的API,因为Java性能可能无法满足...

    PB调用C++ DLL程序范例

    这通常涉及到跨语言交互,使得PB应用程序能够利用C++库的强大功能,比如高效计算、硬件访问或其他C++特有的特性。 在PB中调用C++ DLL的步骤一般包括以下几点: 1. **创建C++ DLL**:首先,我们需要编写C++源代码,...

    C调用REFPROP,c调用c++函数,C,C++

    在描述中提到的"C++调用REFPROP示例",意味着该压缩包包含了一个C++程序,该程序展示了如何在C++环境中调用REFPROP库。"DLL需要自己去下载安装"表明,用户需要首先获取REFPROP的动态链接库(DLL)文件,这是一个可...

    非托管C++调用C#的dll

    然而,CLR VIA C#提供了一种非托管C++直接调用的方法,该方法可以在非托管代码中手动启动CLR加载应用程序域来运行托管的dll,从而调用其中的方法。 知识点1:C++调用C#编写的dll的必要性 在实际开发中,C++和C#是...

    混合编程——C++调用MATLAB程序

    在这个特定的例子中,我们关注的是C++调用MATLAB程序的实践。这种技术常见于需要高性能计算但又希望利用MATLAB强大数学库的场景。 标题“混合编程——C++调用MATLAB程序”暗示了我们要讨论的核心主题:在C++项目中...

    C调用REFPROP_refprop_C++调用refprop_调用REFPROP_C++_C调用REFPROP

    在本文中,我们将深入探讨如何在C++程序中调用REFPROP库,这是一个广泛用于流体性质计算的软件包。REFPROP(Reference ...通过这种方式,你可以在自己的C++应用程序中利用REFPROP的强大功能进行流体性质的精确计算。

    java调用c c++程序实例

    最后,将生成的动态链接库(.dll)放置在Java应用程序的类路径下,或者在系统路径中,这样Java就能找到并加载它。 在Eclipse中,你可以使用外部工具配置来编译C/C++代码,并在Java项目中设置相应的依赖,使得整个...

    C#winform调用C++库案例,使用C++编写动态库,然后再用C#调用当前C++编写的动态库

    通过以上步骤,你就成功地在C# WinForms应用程序中调用了C++编写的动态库。这种方法让.NET开发者能够充分利用C++库的强大功能,同时利用C#的高级特性和开发效率。在实际开发中,务必注意数据类型和调用约定的匹配,...

    C++调用WCF完整示例

    在IT行业中,C++与Windows Communication Foundation(WCF)的结合使用可以实现高效、安全的分布式应用程序。本文将深入探讨如何在C++中调用WCF服务,通过一个完整的示例来阐述整个过程,帮助开发者更好地理解这一...

    C++高效获取函数调用堆栈

    C++高效获取函数调用堆栈 在程序设计和开发过程中,出现问题是很正常的。这时候,快速找到问题所在,并确定程序的上下文环境就变得非常...该方法可以广泛应用于程序设计和开发过程中,以提高程序的稳定性和可靠性。

    C++中的类中函数调用

    C++中类中函数的调用是面向对象编程的重要组成部分,它不仅提供了封装和抽象的能力,还支持继承和多态,使程序设计更加灵活和高效。理解并掌握类中函数的调用机制对于开发复杂的C++应用至关重要。通过本示例的学习,...

    启动其它应用程序

    总结来说,启动其他应用程序在C++中主要有两种方式:利用C++17引入的`std::process`库,或使用底层的Windows API如`CreateProcess`。选择哪种方法取决于你的需求,如是否需要更多的控制权,以及你的项目支持的最低...

    C++,动态调用dll,dll也是由c++实现,且实现了回调功能,即应用程序将函数传入到dll,由dll接口调用函数,以实现回调

    回调是程序设计中的一种常见模式,允许DLL调用应用程序提供的函数。在上述示例中,`myCallbackFunction`是DLL中定义的一个接口,它期望接收一个函数指针作为参数。当DLL执行到适当的地方时,它会通过这个指针调用...

Global site tag (gtag.js) - Google Analytics