我正在尝试使用类似于此代码的 CreateProcessAsUser() API 从服务启动用户模式进程。我的代码在 99% 的情况下都能正常工作,除了 API 有时会成功,我从PROCESS_INFORMATION结构中获取进程句柄,但进程本身没有出现在我打算在其中运行的交互式用户会话中。
有趣的是,如果我在进程句柄上调用GetExitCodeProcess (),它会成功并返回代码 0xC0000142。知道为什么吗?
我正在尝试使用类似于此代码的 CreateProcessAsUser() API 从服务启动用户模式进程。我的代码在 99% 的情况下都能正常工作,除了 API 有时会成功,我从PROCESS_INFORMATION结构中获取进程句柄,但进程本身没有出现在我打算在其中运行的交互式用户会话中。
有趣的是,如果我在进程句柄上调用GetExitCodeProcess (),它会成功并返回代码 0xC0000142。知道为什么吗?
错误 0xC0000142 是STATUS_DLL_INIT_FAILED
(我使用错误代码查找工具确定了这一点)。一个快速的谷歌发现了这个问题,它说:
此问题的最常见原因是链接到的程序
user32.dll
在无法与系统的窗口站和桌面对话的上下文中运行。通常,诸如代理之类的服务在其自己的窗口站和桌面中运行,并且 user32 程序运行良好,但是任何显示对话框的程序都会挂起,而人类没有机会看到错误消息或关闭对话框.
因此,如果您不使用 中的任何函数user32.dll
,则应删除该依赖项。如果您正在使用该 DLL,那么我不确定您应该做什么。一种选择是动态加载 DLLLoadLibrary
并在它成功时使用它(即您有一个有效的窗口会话),或者在它失败时回退到故障模式。
如果 CreateProcess...() API 能够成功创建内部流程对象并开始初始化,则返回 TRUE;他们不会等待进程加载并开始运行其可执行映像。在某些情况下,稍后的初始化会失败,但从内核的角度来看,它仍然是一个成功的进程创建。