C/C++如何启动外部可执行程序(exe)

本文详细介绍了ShellExecute、WinExec、system和CreateProcess四种在Windows平台上启动外部可执行程序的方法,分析了各自的优缺点,指出ShellExecute功能强大但不是真正的句柄,WinExec启动后立即返回但无进程控制,system阻塞直到程序结束,CreateProcess参数丰富但复杂。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文将介绍四种启动外部可执行程序的方法,排版不分优先级,实际应用中需根据需求选择最合适的方法。

1.ShellExecute

 
  1. #include <windows.h>
  2. ShellExecute(NULL,L"open",L"F:\\Code\\C++\\startexetest\\Win32\\Debug\\startexetest.exe",NULL,NULL,SW_SHOW);
  3. HINSTANCE ShellExecute(
  4. HWND hwnd,
  5. LPCTSTR lpOperation,
  6. LPCTSTR lpFile,
  7. LPCTSTR lpParameters,
  8. LPCTSTR lpDirectory,
  9. INT nShowCmd
  10. );
  • hWnd:用于指定父窗口的句柄。当函数调用过程中出现错误时,它将作为Windows消息窗口的父窗口。
  • lpOperation:用于指定要进行的操作, 如: open、runas、print、edit、explore、find。当此参数为NULL时,默认执行open操作。(open:表示执行由lpFile参数指定的程序,或者打开由lpFile参数指定的文件或文件夹。explort:表示打开由lpFile参数指定的文件夹。print:表示打印由lpFile参数指定的文件。)
  • lpParameters:若lpFile参数是一个可执行文件,则此参数指定命令行参数,否则此参数应设为NULL。
  • lpDirectory:用于指定默认目录
  • nShowCmd:用于指定程序窗口初始显示方式。

缺点

  它虽然传回一个HINSTANCE,但他并不是真正的句柄,仅能拿它来做一些错误值检查。

优点:  

 
  1. 它的功能比前WinExec()和system()更强大,它可以执行系统的Shell命令。比如可以启动一个默认的文字处理程序来打开txt文档,再比如可以启动一个默认浏览器来打开一个网址。

2.WinExec

 
  1. #include <windows.h>
  2. WinExec("F:\\Code\\C++\\startexetest\\Win32\\Debug\\startexetest.exe",SW_SHOW);
  3. UINT WinExec(LPCSTR lpCmdLine, UINT uCmdShow);
  • lpCmdLine:指向一个空结束的字符串,串中包含将要执行的应用程序的命令行(文件名加上可选参数)。
  • uCmdShow:定义Windows应用程序的窗口如何显示,并为CreateProcess函数提供STARTUPINFO参数的wShowWindow成员的值。

优点
  启动新进程后会立即返回,因此你的程序无需等待。
  通过参数uCmdShow,可以一定程度上控制窗体的显示,比如让它后台运行而不显示出来。

缺点
  它完全与本进程脱离,无法对做些必要的控制
  无法得知启动的程序是否退出。
  得不到启动的程序的退出码。
  不能打开txt文件或网址

3.system

 
  1. #include <windows.h>
  2. system("F:\\Code\\C++\\startexetest\\Win32\\Debug\\startexetest.exe");

函数功能:执行一个dos命令。如”ping www.vccode.com”, “notepad.exe”。

注意

  • 它不会立即返回,直到你启动的程序执行完成。
  • 如果你启动是带界面的程序,调用此函数会自动打开一个控制台,给人感觉很不友好,但如果启动的程序本身是带控制台的,而且又需要等待它的完成,那这将是比较好的选择。
  • 它的返回值代表是否执行成功以及程序的退出码。
  • 不能运行打开txt或者网站

4.CreateProcess

 
  1. #include <windows.h>
  2. STARTUPINFO StartInfo;
  3. PROCESS_INFORMATION pinfo;
  4. memset(&StartInfo,0,sizeof(STARTUPINFO));
  5. StartInfo.cb = sizeof(STARTUPINFO);
  6. CreateProcess(L"F:\\Code\\C++\\startexetest\\Win32\\Debug\\startexetest.exe"
  7. ,L"",NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&StartInfo,&pinfo);
  8. BOOL CreateProcess
  9. (
  10. LPCTSTR lpApplicationName,
  11. LPTSTR lpCommandLine,
  12. LPSECURITY_ATTRIBUTES lpProcessAttributes,
  13. LPSECURITY_ATTRIBUTES lpThreadAttributes,
  14. BOOL bInheritHandles,
  15. DWORD dwCreationFlags,
  16. LPVOID lpEnvironment,
  17. LPCTSTR lpCurrentDirectory,
  18. LPSTARTUPINFO lpStartupInfo,
  19. LPPROCESS_INFORMATIONlpProcessInformation
  20. );
  • lpApplicationName:指向一个NULL结尾的、用来指定可执行模块的字符串。这个字符串可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处于 lpCommandLine参数最前面并由空格符与后面的字符分开。
  • lpCommandLine:指向一个以NULL结尾的字符串,该字符串指定要执行的命令行。这个参数可以为空,那么函数将使用lpApplicationName参数指定的字符串当做要运行的程序的命令行。如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。新运行的进程可以使用GetCommandLine函数获得整个命令行。C语言程序可以使用argc和argv参数。
  • lpProcessAttributes:指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。在Windows NT中:SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员指定了新进程的安全描述符,如果参数为空,新进程使用默认的安全描述符。
  • lpThreadAttributes:同lpProcessAttribute,不过这个参数决定的是线程是否被继承.通常置为NULL.
  • bInheritHandles:指示新进程是否从调用进程处继承了句柄。如果参数的值为真,调用进程中的每一个可继承的打开句柄都将被子进程继承。被继承的句柄与原进程拥有完全相同的值和访问权限。
  • dwCreationFlags:指定附加的、用来控制优先类和进程的创建的标志。以下的创建标志可以以除下面列出的方式外的任何方式组合后指定。
  • lpEnvironment:指向一个新进程的环境块。如果此参数为空,新进程使用调用进程的环境。
  • lpCurrentDirectory:指向一个以NULL结尾的字符串,这个字符串用来指定子进程的工作路径。这个字符串必须是一个包含驱动器名的绝对路径。如果这个参数为空,新进程将使用与调用进程相同的驱动器和目录。这个选项是一个需要启动应用程序并指定它们的驱动器和工作目录的外壳程序的主要条件。
  • lpStartupInfo:指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体。
  • lpProcessInformation:指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体。

.

优点:功能十分强大,可以指定很多参数

缺点:参数太多,使用起来比较麻烦

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值