外部調用程序的幾種啓動方式

原文鏈接: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

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