我正在尝试从服务启动另一个进程(它是一个收集一些数据并将其写入注册表的控制台应用程序)但由于某种原因我无法正常启动它。
我正在尝试做的事情的基础如下:
- 启动进程
- 等待进程完成
- 从进程中检索返回码
我目前正在使用以下代码:
STARTUPINFO info={sizeof(info)};
PROCESS_INFORMATION processInfo;
if (CreateProcess(PATH, ARGS, NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo))
{
::WaitForSingleObject(processInfo.hProcess, INFINITE);
DWORD exit = 100;
GetExitCodeProcess(processInfo.hProcess, &exit);
CloseHandle(processInfo.hProcess);
CloseHandle(processInfo.hThread);
return exit;
}
调用 CreateProcess() 后,它成功并进入 if 语句的主体。对 WaitForSingleObject 的调用会立即返回,但它不应该返回,因为该过程大约需要 20-30 秒才能完成。最后,调用 GetExitCodeProcess() 失败并且未设置值“exit”。
仅供引用,这是我在其他地方成功使用过的代码,只是不在服务中。
会不会是它是从服务启动的,有权限问题??
编辑:我现在意识到它实际上会启动该应用程序(我可以在 TaskMan 中看到它)但它似乎被卡住了。它在那里,但没有做任何事情。
基于 Rob Kennedy 的 suggestion ,我修复了进程句柄问题,它实际上确实在等待进程完成。但它永远不会完成,除非我手动杀死它。
最佳答案
WaitForSingleObject
和 GetExitCodeProcess
期望进程句柄本身,而不是指向进程句柄的指针。删除与号。
此外,检查返回值并在失败时调用 GetLastError
。这将帮助您诊断 future 的问题。永远不要假设 API 函数总是会成功。
一旦您正确调用函数,并且新进程开始但没有任何进展,您就可以合理地确定此代码不是罪魁祸首。问题出在新进程上,所以把你的调试任务集中在那里,而不是在服务进程上。
关于c++ - 从服务启动进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/318265/