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可执行文件,但请跳过尝试创建窗口的部分