外部调用程序的几种启动方式

原文链接:https://blog.csdn.net/komtao520/article/details/80003731

system

int system( const char *command );

采用命令行的方式启动,比较简单,返回值代表成功以及退出码,但也有很多缺点:
  (1)、会启动一个控制台,对控制台无法控制。 
  (2)、不能运行*.txt文件或进入网址

WinExec

调用WinExec函数,只需要输入路径和显示方式就可以了,比较简单,它将启动了一个新进程,并且立即返回,因此你的程序无需等待,能够控制窗口的显示,但也有缺点:

(1)、与本进程完全脱离,无法控制,得不到启动程序的退出码等

(2)、不能运行*.txt文件或进入网址

UINT result = WinExec(string lpCmdLine,long nCmdShow)

lpCmdLine:exe路径,例如:“C:\\Program Files\\Everything\\Everything.exe” 如果有命令行,在路径后面加上:空格+命令行

nCmdShow:窗口显示方式:

ShellExecute

  相对于前两种,参数较多,复杂了些,但复杂有复杂的好处,除了能启动exe,控制显示窗口,还能打开网址、txt等,但返回值是错误类型,并非启动的进程的句柄,所以依旧不能控制启动的进程。

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

  hwnd:一窗体句柄,将作为启动的程序的父窗体。 
  lpVerb:你想执行的操作(edit 、explore、find、open、print、properties),你也可以传入NULL值,它将执行默认操作(win2000以前与以后处理略有差别,请见MSDN)。 
  lpFile:一文件名或操作的对象。 
  lpParameters:如果lpFile是一可执行文件,这个将作为它的参数。它的格式由执行的操作决定。而且当lpFile为一document文件时,此参数需为NULL。 
  lpDirectory:指定它的工作目录。 
  nShowCmd:窗体显示的控制。

例:
ShellExecute(NULL,"open","D://Test.txt",NULL,NULL,SW_SHOWNORMAL); // 打开C:/Test.txt 文件
ShellExecute(NULL, "open", "http://www.baidu.com", NULL, NULL, SW_SHOWNORMAL); // 打开网页www.baidu.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

CreateProcess

十分复杂的一种方式,但也是功能十分强大的方式,包含有以上启动方式的功能的同时也能对启动程序进行控制,

BOOL CreateProcess( 
 LPCTSTR lpApplicationName, 
 LPTSTR lpCommandLine, 
 LPSECURITY_ATTRIBUTES lpProcessAttributes, 
 LPSECURITY_ATTRIBUTES lpThreadAttributes, 
 BOOL bInheritHandles, 
 DWORD dwCreationFlags, 
 LPVOID lpEnvironment, 
 LPCTSTR lpCurrentDirectory, 
 LPSTARTUPINFO lpStartupInfo, 
 LPPROCESS_INFORMATION lpProcessInformation 
); 
参数: 
  lpApplicationName:指向一个以空结尾的串,他指定了要执行的模块 
  lpCommandLine:指向一个以空结尾的串,该串定义了要执行的命令行。 
  lpProcessAttributes:指向一个SECURITY_ATTRIBUTES结构,该结构决定了返回的句柄是否可被子进程继承。 
  lpThreadAttributes:指向一个SECURITY_ATTRIBUTES结构,该结构决定了返回的句柄是否可被子进程继承。 
  bInheritHandles,:表明新进程是否从调用进程继承句柄。 
  dwCreationFlags:定义控制优先类和进程创建的附加标志。 
  lpEnvironment:指向一个新进程的环境块。 
  lpCurrentDirectory:指向一个以空结尾的串,该串定义了子进程的当前驱动器和当前目录。 
  lpStartupInfo:指向一个STARTUPINFO结构,该结构定义了新进程的主窗口将如何显示。 
  lpProcessInformation:指向PROCESS_INFORMATION结构,该结构接受关于新进程的表示信息。 
  ⑶ 返回值: 
  若函数调用成功,则返回值不为0;若函数调用失败,返回值为0。 
  在上述参数中,参数lpStartupInfo是STARTUPINFO结构。可以用来设置控台的标题,新窗口的的初始大小和位置,及重定向标准输入 和输出。新程序通常可以忽略多数这些数据项,如果选择那样做的话。可以规定该结构体中的标志,已表明要设置的数据段。有时,不想设置任何信息,也必须传递 一个有效的指针给空结构(确定设置大小到cb,及设置dwFlags成员为0)。参数lpProcessInformation返回进程和线程句柄,还包 括进程和线程ID。这些句柄拥有在参数lpProcessAttributes和lpThreadAttributes中规定的访问。
  要注意,针对CreateProcess的一些参数对控制台应用程序是特定的,而其它参数则对各种应用程序有用。大多数情况下,并不一定要填入 STARTUPINFO结构,但无论如何必须提供它。其返回值是布尔型的,而真正感兴趣的返回值发生于作为参数传送的结构中 (PROCESS_INFORMATION)。CreateProcess返回该结构中的进程ID及其句柄,以及初始线程ID及其句柄。可以将ID发送到 其它进程,或使用句柄来控制新进程。
  ShellExecute和WinExec命令用于简单的作业。如果要完全控制一个新进程,就必须调用CreateProcess。

QProcess

 利用QT的QProcess实现,简单易懂,而且方式很多,详情可以参考qt帮助文档

例子:

QString path = "C:\\Program Files\\Everything\\Everything.exe";
QString workPath = "C:\\Program Files\\Everything";

QProcess *process = new QProcess;
process->setWorkingDirectory(workPath );
process->start("\"" + path + "\"");

参考链接:(1)https://blog.csdn.net/komtao520/article/details/80003731

(2)https://blog.csdn.net/zhongcaojieji/article/details/6103772

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章