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