CreateProcess成功,但GetExitCodeProcess返回C0000142

时间:2012-11-16 22:06:48

标签: c++ winapi process

我正在尝试使用类似于this code的CreateProcessAsUser()API从服务启动用户模式进程。我的代码在99%的时间内工作正常,除非API成功,我从PROCESS_INFORMATION结构获取进程句柄但是进程本身没有出现在我打算用于它的交互式用户会话中跑进来。

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

2 个答案:

答案 0 :(得分:7)

错误0xC0000142是STATUS_DLL_INIT_FAILED(我使用Error Code Lookup Tool确定了这一点)。快速谷歌发现this question,其中说:

  

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

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

答案 1 :(得分:5)

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