2010-02-15 65 views

回答

2

ShellExecute可用於創建一個進程,它是一個更方便的方式傳遞參數。

但是,如果你想使用過程中的輸出,那麼CreateProcess可能是你最好的選擇

隨着CreateProcess你可以傳遞一個STARTUPINFO結構,可用於將文件管道句柄傳遞到標準輸出的過程中。

CreateProcess將返回包含HANDLE的PROCESS_INFORMATION結構到創建的進程。該過程將在過程退出時變成信號。

所以你可以在WaitForSingleObject的進程句柄上等待輸出完成。

當你完成後,不要忘記CloseHandle上的進程句柄和線程句柄。

+0

如果您要啓動的進程需要提升(或Vista/7會自動認爲它有,因爲它的文件名或其他啓發式)CreateProcess將失敗,您需要處理該特定的錯誤。請參閱http://msdn.microsoft.com/en-us/library/bb756945.aspx。 ShellExecute或ShellExecuteEx是最簡單的,第二個可以讓您獲得流程信息,我認爲它包含您可以像約翰描述的那樣使用流程句柄。 –

1

取決於您如何衡量效率。 system()是程序員高效。

另請參閱exec()及其許多兄弟。

1

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); 
+0

popen()只能從控制檯通過GUI ap工作。而且請不要在(!feof(f)){ - 它被濫用的時候提示。 – 2010-02-15 21:46:59

+0

我改變feof的使用。 –

+0

來自MSDN「如果在Windows程序中使用,_popen函數會返回一個無效的文件指針,導致程序無限期掛起。_popen在控制檯應用程序中正常工作。」請參閱http://msdn.microsoft.com/en-us/library/96ayss4b%28VS.71%29.aspx – 2010-02-15 21:51:59

1

如何執行Windows程序並捕獲其輸出的經典源碼是this article on MSDN - 它實際上並不像看起來那麼複雜。

1

如果您需要完全控制(更改標準輸入/輸出等),CreateProcess是您的最佳選擇。如果您正在執行用戶指定的內容,則確實需要使用ShellExecute [Ex],因爲對於需要UAC提升的應用程序,CreateProcess將會失敗(當您啓動應用程序時,ShellExecuteEx也能夠爲您提供子進程的句柄)

相關問題