题
我无法启动另一个进程从一个服务(这是一个控制台应用程序,收集一些数据并将其写入登记册),但由于某些原因我不能让它启动正常。
我基本是我我试图要做的是如下:
- 启动该进程
- 等待进程的完成
- 检索的返回代码处理
我目前正在使用下列代码:
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(),它成功和进入体内的,如果声明。呼叫WaitForSingleObject立即返回,它不应该,因为这个过程大约需要20-30秒以完成。最后,呼吁GetExitCodeProcess()失败,并不设置价值"退出"。
仅供参考,这是码我实际上其他地方使用与取得成功,就不能在一个服务。
它可能正在启动一个服务,并有权限的问题??
编辑: 我现在已经意识到,这实际上将启动该程序(我可以看到它在TaskMan),但它似乎被卡住了。它的存在,但是没有做任何事情。
根据罗伯*肯尼迪的 建议, 我固定的过程中处理的问题,这实际上等待进程的完成。但它永远不会完成的,除非我杀了手工。
解决方案
WaitForSingleObject
和 GetExitCodeProcess
期望的过程中处理本身,不是一个指向过程中处理。除符号.
此外,检查返回的价值观和呼叫 GetLastError
当他们失败。这将有助于你的诊断未来的问题。永远不要假设API功能将始终取得成功。
一旦你打电话的功能和新的过程的启动,但没有取得进展,可以合理地肯定, 此 代码是不是罪魁祸首。问题在于在新的过程,因此重点调试任务,在那里,不在服务的过程。
其他提示
下面的更新和编辑,这听起来像许多可能的陷阱当启动一个进程从一个服务。是否有任何可能性的任何-那你的外部进程等待用户的互动?有三个主要例子我能想到的一个实例就是一个命令行程序,这可能会在某些情况下需要的键盘输入(例如类似"cmd/c德*.*" 将要求用户的确认)。其他例子将申请,如果应用程序需要一个窗口,是显示它但是你不能看到它。如果是这种情况下,你可能希望设置您服务"的交互桌面",同时调试,然后才能够看到的申请窗口(或一个意想不到的Windows的错误信息,例如无法找到一个DLL或类似)。
如果这有助于你在调试或不是,通常的"一个-哈!"那一刻从实现的事情,例如环境变量,路径,当前的目录,并因此在不是也许有什么你期望从内的服务。权限是不是最常见的原因,这种问题。你能提供一些细节关于外部应用程序,你们无法启动,或许这将有助于思考了这一点。
因为你正在启动一个控制台应用程序,它就可能有隐藏的启动代码,试图初始化控制台。服务不附桌面上,并且我是肯定的一过程推出的服务不会被任,因此它将不能够创建一个控制台。这可能是点,它挂。
如果可以的话,尝试改变你的过程变成一个完整的Windows的可执行,但是跳跃的部分,试图创建一个窗口。