c++ - 从服务启动进程

标签 c++ service createprocess

我正在尝试从服务启动另一个进程(它是一个收集一些数据并将其写入注册表的控制台应用程序)但由于某种原因我无法正常启动它。

我正在尝试做的事情的基础如下:

  1. 启动进程
  2. 等待进程完成
  3. 从进程中检索返回码

我目前正在使用以下代码:

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 ,我修复了进程句柄问题,它实际上确实在等待进程完成。但它永远不会完成,除非我手动杀死它。

最佳答案

WaitForSingleObjectGetExitCodeProcess 期望进程句柄本身,而不是指向进程句柄的指针。删除与号。

此外,检查返回值并在失败时调用 GetLastError。这将帮助您诊断 future 的问题。永远不要假设 API 函数总是会成功。

一旦您正确调用函数,并且新进程开始但没有任何进展,您就可以合理地确定代码不是罪魁祸首。问题出在新进程上,所以把你的调试任务集中在那里,而不是在服务进程上。

关于c++ - 从服务启动进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/318265/

相关文章:

c++ - Clang 未能检测到未定义的行为

c++ - 没有 return 语句到达函数末尾

android - 如何杀死一个android服务?

javascript - AngularJS:尝试使用服务,出现错误 "cannot read property ',然后是“未定义”

c++ - 从控制台应用程序启动控制台应用程序

C++ 在不重定向输出的情况下运行批处理文件

c++ - Eigen 和动态分配

c++ - Armadillo 和 C++ - 使用二维数组进行矩阵初始化

Android使用Local Service的目的是什么

c++ - 单独调用两个 CreateProcess() 可以共享相同的启动和进程信息吗?