CreateProcess()想出了幾次搜索谷歌....
可以假設這是最安全和最有效的方法?
如果是這樣,我想使用被調用進程的輸出。
在繼續使用C程序之前,我怎麼知道它已經完成?如何從C程序(使用winapi)調用可執行文件?
謝謝。
CreateProcess()想出了幾次搜索谷歌....
可以假設這是最安全和最有效的方法?
如果是這樣,我想使用被調用進程的輸出。
在繼續使用C程序之前,我怎麼知道它已經完成?如何從C程序(使用winapi)調用可執行文件?
謝謝。
ShellExecute可用於創建一個進程,它是一個更方便的方式傳遞參數。
但是,如果你想使用過程中的輸出,那麼CreateProcess
可能是你最好的選擇
隨着CreateProcess
你可以傳遞一個STARTUPINFO結構,可用於將文件管道句柄傳遞到標準輸出的過程中。
CreateProcess
將返回包含HANDLE的PROCESS_INFORMATION結構到創建的進程。該過程將在過程退出時變成信號。
所以你可以在WaitForSingleObject的進程句柄上等待輸出完成。
當你完成後,不要忘記CloseHandle
上的進程句柄和線程句柄。
CreateProcess()
是一個相當低級的產卵子過程函數,可能不是最方便的選擇。當您需要讀取輸出一個C程序,考慮popen()
(注意MS CRT它的名字前放置一個下劃線):
FILE *f = _popen("dir", "r");
char buf[1000];
while (fgets(buf, sizeof(buf), f)) {
// .. process output using stdio functions
}
_pclose(f);
popen()只能從控制檯通過GUI ap工作。而且請不要在(!feof(f)){ - 它被濫用的時候提示。 – 2010-02-15 21:46:59
我改變feof的使用。 –
來自MSDN「如果在Windows程序中使用,_popen函數會返回一個無效的文件指針,導致程序無限期掛起。_popen在控制檯應用程序中正常工作。」請參閱http://msdn.microsoft.com/en-us/library/96ayss4b%28VS.71%29.aspx – 2010-02-15 21:51:59
如何執行Windows程序並捕獲其輸出的經典源碼是this article on MSDN - 它實際上並不像看起來那麼複雜。
如果您需要完全控制(更改標準輸入/輸出等),CreateProcess是您的最佳選擇。如果您正在執行用戶指定的內容,則確實需要使用ShellExecute [Ex],因爲對於需要UAC提升的應用程序,CreateProcess將會失敗(當您啓動應用程序時,ShellExecuteEx也能夠爲您提供子進程的句柄)
如果您要啓動的進程需要提升(或Vista/7會自動認爲它有,因爲它的文件名或其他啓發式)CreateProcess將失敗,您需要處理該特定的錯誤。請參閱http://msdn.microsoft.com/en-us/library/bb756945.aspx。 ShellExecute或ShellExecuteEx是最簡單的,第二個可以讓您獲得流程信息,我認爲它包含您可以像約翰描述的那樣使用流程句柄。 –