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

我基本是我我试图要做的是如下:

  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(),它成功和进入体内的,如果声明。呼叫WaitForSingleObject立即返回,它不应该,因为这个过程大约需要20-30秒以完成。最后,呼吁GetExitCodeProcess()失败,并不设置价值"退出"。

仅供参考,这是码我实际上其他地方使用与取得成功,就不能在一个服务。

它可能正在启动一个服务,并有权限的问题??

编辑: 我现在已经意识到,这实际上将启动该程序(我可以看到它在TaskMan),但它似乎被卡住了。它的存在,但是没有做任何事情。
根据罗伯*肯尼迪的 建议, 我固定的过程中处理的问题,这实际上等待进程的完成。但它永远不会完成的,除非我杀了手工。

有帮助吗?

解决方案

WaitForSingleObjectGetExitCodeProcess 期望的过程中处理本身,不是一个指向过程中处理。除符号.

此外,检查返回的价值观和呼叫 GetLastError 当他们失败。这将有助于你的诊断未来的问题。永远不要假设API功能将始终取得成功。

一旦你打电话的功能和新的过程的启动,但没有取得进展,可以合理地肯定, 代码是不是罪魁祸首。问题在于在新的过程,因此重点调试任务,在那里,不在服务的过程。

其他提示

下面的更新和编辑,这听起来像许多可能的陷阱当启动一个进程从一个服务。是否有任何可能性的任何-那你的外部进程等待用户的互动?有三个主要例子我能想到的一个实例就是一个命令行程序,这可能会在某些情况下需要的键盘输入(例如类似"cmd/c德*.*" 将要求用户的确认)。其他例子将申请,如果应用程序需要一个窗口,是显示它但是你不能看到它。如果是这种情况下,你可能希望设置您服务"的交互桌面",同时调试,然后才能够看到的申请窗口(或一个意想不到的Windows的错误信息,例如无法找到一个DLL或类似)。

如果这有助于你在调试或不是,通常的"一个-哈!"那一刻从实现的事情,例如环境变量,路径,当前的目录,并因此在不是也许有什么你期望从内的服务。权限是不是最常见的原因,这种问题。你能提供一些细节关于外部应用程序,你们无法启动,或许这将有助于思考了这一点。

因为你正在启动一个控制台应用程序,它就可能有隐藏的启动代码,试图初始化控制台。服务不附桌面上,并且我是肯定的一过程推出的服务不会被任,因此它将不能够创建一个控制台。这可能是点,它挂。

如果可以的话,尝试改变你的过程变成一个完整的Windows的可执行,但是跳跃的部分,试图创建一个窗口。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top