2015-06-03 46 views
0

我正在使用以下代碼使用CreateProcess()api執行'taskkill'命令。檢查使用CreateProcess執行的命令的返回值

STARTUPINFO si; 
PROCESS_INFORMATION pi; 

ZeroMemory(&si, sizeof(si)); 
si.cb = sizeof(si); 
ZeroMemory(&pi, sizeof(pi)); 

TCHAR cmd[] = TEXT("taskkill /F /T /IM <exe name>"); 

if (CreateProcess(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, & pi)) 
{ 
    // wait for child process to exit 
    DWORD waitForStatus = WaitForSingleObject(pi.hProcess, 10000); 

    // close process and thread handles 
    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 

    /* code to throw exception based on the return value waitForStatus */ 
} 
else 
{ 
    /* code to throw exception if CreateProcess() failed */ 
} 

我觀察到的是如果進程沒有運行,任務kill會失敗,但是CrateProcess()不會指出錯誤。如何從CreateProcess中獲取此錯誤?

即使使用/ F開關,有沒有可能導致進程不被taskkill殺死?

回答

3

CreateProcess只負責產卵/創建子進程(在你的情況下爲taskkill.exe),因爲它是成功的,因此它返回TRUE。監控子流程以及何時結束以獲取退出代碼是您的代碼的責任。做到這一點通過關閉其句柄調用之前GetExitCodeProcess

GetExitCodeProcess(pi.hProcess, &ec); 

不要忘了申報ec第一(作爲DWORD)。 也顛倒句柄關閉的順序(它不是強制性的,但邏輯上線程在其處理之前結束)。

+0

關閉句柄的順序,我在msdn鏈接中看到它https://msdn.microsoft.com/en-us/library/windows/desktop/ms682512(v=vs.85).aspx –

+0

在您關閉句柄無關緊要 - 它們屬於您的流程,並且不會以任何方式影響子流程。 –

+0

是的,我意識到這一點,我提到它......它只是一個語法上的糖...線程在進程之前被銷燬(在代碼中) – CristiFati