9

我正在尝试使用类似于此代码的 CreateProcessAsUser() API 从服务启动用户模式进程。我的代码在 99% 的情况下都能正常工作,除了 API 有时会成功,我从PROCESS_INFORMATION结构中获取进程句柄,但进程本身没有出现在我打算在其中运行的交互式用户会话中。

有趣的是,如果我在进程句柄上调用GetExitCodeProcess (),它会成功并返回代码 0xC0000142。知道为什么吗?

4

2 回答 2

9

错误 0xC0000142 是STATUS_DLL_INIT_FAILED(我使用错误代码查找工具确定了这一点)。一个快速的谷歌发现了这个问题,它说:

此问题的最常见原因是链接到的程序user32.dll在无法与系统的窗口站和桌面对话的上下文中运行。通常,诸如代理之类的服务在其自己的窗口站和桌面中运行,并且 user32 程序运行良好,但是任何显示对话框的程序都会挂起,而人类没有机会看到错误消息或关闭对话框.

因此,如果您不使用 中的任何函数user32.dll,则应删除该依赖项。如果您正在使用该 DLL,那么我不确定您应该做什么。一种选择是动态加载 DLLLoadLibrary并在它成功时使用它(即您有一个有效的窗口会话),或者在它失败时回退到故障模式。

于 2012-11-16T22:25:16.137 回答
7

如果 CreateProcess...() API 能够成功创建内部流程对象并开始初始化,则返回 TRUE;他们不会等待进程加载并开始运行其可执行映像。在某些情况下,稍后的初始化会失败,但从内核的角度来看,它仍然是一个成功的进程创建。

于 2012-11-16T23:03:36.277 回答