我使用以下代码使用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杀死?
答案 0 :(得分:4)
CreateProcess 仅负责生成/创建子流程(在您的情况下为 taskkill.exe ),这是成功的,因此它返回 TRUE 。监视子进程以及何时结束以获取其退出代码是您的代码的责任。在关闭句柄之前调用[MS.Docs]: GetExitCodeProcess function来执行此操作:
GetExitCodeProcess(pi.hProcess, &ec);
不要忘记先声明 ec (DWORD ec;
)。
另外,颠倒句柄关闭的顺序(它不是强制性的,但逻辑上一个线程在其处理之前结束)。