2011-02-14 81 views
2

我正試圖編寫一個程序,該程序在當前目錄中執行MinGW分發中的make.exe,並使用其STDOUT數據和退出代碼。我有一個句柄來處理從CreatePipe創建數據的STDOUT。當我得到這個管道的ERROR_HANDLE_EOF我假定進程已退出,並得到其退出代碼:OpenProcess錯誤87無效參數

if(session->pid == 0) return; 
HANDLE hp = OpenProcess(PROCESS_QUERY_INFORMATION | 
      PROCESS_TERMINATE, TRUE, session->pid); 
if(hp == NULL) { 
    printf("OpenProcess(%i) failed, error: %i\n", 
     session->pid, (int)GetLastError()); 
    return; 
} 

我的代碼工作在我測試(如PWD,LS等)所有其他MinGW的事業,我毫無問題地獲得STDOUT和退出代碼。但是,當我試穿一下牌子,上面的代碼顯示以下信息:

「OpenProcess(2032)失敗,錯誤:87」

我用Google搜索錯誤代碼87,並說「無效的參數」。我不明白什麼可能是無效的積極進程id像2032.任何想法?

回答

4

您應該使用CreateProcess的句柄,而不是在PID上使用OpenProcess

OpenProcess只適用於過程對象仍然存在的情況。如果進程對象消失,那麼在調用OpenProcess時,結果是帶有無效參數的調用。

您使用其他實用程序獲得的成功要麼是由於競爭條件(可能會失敗),要麼您將原始句柄保留在子進程打開狀態。

0

儘管帖子已經過時,但我注意到當進程存在時,我得到了ERROR_INVALID_PARAMETER,但擁有不同的用戶和/或Windows桌面和/或終端服務器會話。

奇怪的是,WTSEnumerateProcess()函數不會遭受這個錯誤,但是更加昂貴,尤其是在已經處於很多進程負載很重的系統上(並且我甚至呼籲我甚至耗盡windows內核資源)。

因此,不可能提供「真實」無效參數並提供訪問錯誤。我會期待ERROR_ACCESS_DENIED而不是(但調用任務管理器作爲普通/非高級用戶仍顯示所有進程)。

看起來像Windows中的一些不一致嗎?