C++ 从服务启动进程

C++ 从服务启动进程,c++,service,createprocess,C++,Service,Createprocess,我正在尝试从服务启动另一个进程(它是一个控制台应用程序,收集一些数据并将其写入注册表),但由于某些原因,我无法让它正常启动 我想做的基本工作如下: 启动流程 等待进程完成 从进程中检索返回代码 我目前正在使用以下代码: STARTUPINFO info={sizeof(info)}; PROCESS_INFORMATION processInfo; if (CreateProcess(PATH, ARGS, NULL, NULL, TRUE, 0, NULL, NULL, &info,

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

我想做的基本工作如下:

  • 启动流程
  • 等待进程完成
  • 从进程中检索返回代码
  • 我目前正在使用以下代码:

    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的,我修复了进程句柄问题,它实际上是等待进程完成。但是它永远不会结束,除非我手动终止它。

    WaitForSingleObject
    GetExitCodeProcess
    需要进程句柄本身,而不是指向进程句柄的指针。取下符号和

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


    一旦您正确调用了函数,并且新流程开始但没有进展,您就可以合理地确定这段代码不是罪魁祸首。问题在于新流程,因此将调试任务集中在那里,而不是服务流程。

    在更新和编辑之后,这听起来像是从服务启动流程时可能遇到的众多问题之一。您的外部进程是否有可能等待用户交互?我可以想到三个主要的例子,一个是命令行应用程序,在某些情况下可能需要键盘输入(例如,“cmd/cdel**”之类的东西需要用户确认)。如果应用程序需要一个窗口,并且正在显示它,但是您看不到它,那么其他示例也适用。如果是这种情况,您可能希望在调试时将服务设置为“与桌面交互”,然后能够看到应用程序窗口(或意外的Windows错误消息,例如找不到DLL或类似文件)


    如果这有助于您进行调试,那么“a-ha!”时刻通常来自于意识到环境变量、路径、当前目录等内容可能不是您在服务中所期望的。权限不是此类问题最常见的原因。您能否提供一些关于您尝试启动的外部应用程序的详细信息,这可能有助于您思考这个问题。

    由于您正在启动控制台应用程序,可能有隐藏的启动代码试图初始化控制台。服务没有连接到桌面,我相信服务启动的进程也不会连接到桌面,因此它将无法创建控制台。这可能是它悬挂的地方

    如果可以,请尝试将进程更改为完整的Windows可执行文件,但请跳过尝试创建窗口的部分