C/C++如何启动外部可执行程序(exe) 您所在的位置:网站首页 可运行exe的windows模拟器 C/C++如何启动外部可执行程序(exe)

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

2023-07-25 10:29| 来源: 网络整理| 查看: 265

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

1.ShellExecute #include ShellExecute(NULL,L"open",L"F:\\Code\\C++\\startexetest\\Win32\\Debug\\startexetest.exe",NULL,NULL,SW_SHOW);

HINSTANCE ShellExecute( HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd );

hWnd:用于指定父窗口的句柄。当函数调用过程中出现错误时,它将作为Windows消息窗口的父窗口。lpOperation:用于指定要进行的操作, 如: open、runas、print、edit、explore、find。当此参数为NULL时,默认执行open操作。(open:表示执行由lpFile参数指定的程序,或者打开由lpFile参数指定的文件或文件夹。explort:表示打开由lpFile参数指定的文件夹。print:表示打印由lpFile参数指定的文件。)lpParameters:若lpFile参数是一个可执行文件,则此参数指定命令行参数,否则此参数应设为NULL。lpDirectory:用于指定默认目录nShowCmd:用于指定程序窗口初始显示方式。

缺点:

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

优点:  

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

2.WinExec #include WinExec("F:\\Code\\C++\\startexetest\\Win32\\Debug\\startexetest.exe",SW_SHOW);

UINT WinExec(LPCSTR lpCmdLine, UINT uCmdShow); lpCmdLine:指向一个空结束的字符串,串中包含将要执行的应用程序的命令行(文件名加上可选参数)。uCmdShow:定义Windows应用程序的窗口如何显示,并为CreateProcess函数提供STARTUPINFO参数的wShowWindow成员的值。

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

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

3.system #include system("F:\\Code\\C++\\startexetest\\Win32\\Debug\\startexetest.exe");

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

注意: 

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

4.CreateProcess #include STARTUPINFO StartInfo; PROCESS_INFORMATION pinfo; memset(&StartInfo,0,sizeof(STARTUPINFO)); StartInfo.cb = sizeof(STARTUPINFO); CreateProcess(L"F:\\Code\\C++\\startexetest\\Win32\\Debug\\startexetest.exe" ,L"",NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&StartInfo,&pinfo);

BOOL CreateProcess ( LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATIONlpProcessInformation );

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结构体。

.

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

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有