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