检查使用CreateProcess执行的命令的返回值

时间:2015-06-03 07:00:05

标签: windows

我使用以下代码使用CreateProcess()api执行'taskkill'命令。

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 */
}

我观察到的是,如果进程未运行,则任务终止失败,但CrateProcess()不指示错误。如何从CreateProcess获取此错误?

即使使用/ F开关,这个过程是否有可能被taskkill杀死?

1 个答案:

答案 0 :(得分:4)

CreateProcess 仅负责生成/创建子流程(在您的情况下为 taskkill.exe ),这是成功的,因此它返回 TRUE 。监视子进程以及何时结束以获取其退出代码是您的代码的责任。在关闭句柄之前调用[MS.Docs]: GetExitCodeProcess function来执行此操作:

GetExitCodeProcess(pi.hProcess, &ec);

不要忘记先声明 ec DWORD ec;)。 另外,颠倒句柄关闭的顺序(它不是强制性的,但逻辑上一个线程在其处理之前结束)。