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

wko9yo5t  于 2023-02-13  发布在  Windows
关注(0)|答案(1)|浏览(358)

我使用以下代码通过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 */
}

我观察到的是,如果进程没有运行,任务kill失败,但CrateProcess()并没有指示错误,如何从CreateProcess得到这个错误?
是否有可能即使使用/F开关,进程也不会被taskkill杀死?

rekjcdws

rekjcdws1#

CreateProcess 仅负责生成/创建成功的子进程(在您的情况下为 * taskkill.exe *),因此它返回 TRUE

你的代码负责监控子进程,并在它结束时获取它的退出代码,在关闭它的句柄之前调用[MS.Learn]: GetExitCodeProcess function (processthreadsapi.h)即可:

// ...

DWORD ec;

// ...

GetExitCodeProcess(pi.hProcess, &ec);

颠倒句柄关闭的顺序(这不是强制性的,但逻辑上线程在其进程之前结束)。

相关问题