【问题标题】:Failed to load user32.dll when launching a process running in non-default desktop in Session 0 Winsta0在会话 0 Winsta0 中启动在非默认桌面中运行的进程时无法加载 user32.dll
【发布时间】:2016-08-25 00:07:43
【问题描述】:

我有一个 Windows 服务(在 Windows Vista+ 上运行),它需要启动一个普通的 GUI 应用程序。出于某种原因,我需要在非默认桌面上运行 GUI 应用程序(当然,由于它是由服务进程启动的,所以它在 Session 0、WinSta0 中运行,而不是在默认桌面上)。

代码如下所示。

// create new desktop
hDesktop = CreateDesktop(NEW_DESKTOP, 0, 0 ,0,
        DESKTOP_SWITCHDESKTOP | DESKTOP_WRITEOBJECTS |
        DESKTOP_READOBJECTS | DESKTOP_ENUMERATE |
        DESKTOP_CREATEWINDOW | DESKTOP_CREATEMENU|
        DESKTOP_HOOKCONTROL, &sa);

// create process of the normal GUI application,
// running on the new desktop, not the default one
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.lpDesktop = NEW_DESKTOP;
ZeroMemory(&processInfo,sizeof(processInfo));
BOOL bRet = CreateProcess(NULL, &commandLine, NULL, NULL,
        FALSE, 0, NULL, NULL, &si, &processInfo);

TCreateProcess(...) 方法成功返回,但 GUI 应用程序在启动后立即退出。在 Gflags 的帮助下,我得到了以下信息。

LdrpInitializeRoutines - Error: Init routine 7595D711 for DLL "C:\Windows\system32\USER32.dll" failed during DLL_PROCESS_ATTACH
_LdrpInitialize - ERROR: Process initialization failed with status 0xc0000142
LdrpInitializationFailure - ERROR: Process initialization failed with status 0xc0000142

我搜索了一段时间,似乎与安全问题有关。我尝试将所有桌面相关权限授予当前用户,但没有帮助。

有一件事可能会有所帮助。我注意到使用SYSTEM帐户运行时有几个DLL没有加载,第一个是uxTheme.dll。

有人知道为什么它不能在非默认桌面上工作,而在默认桌面上工作得很好?

谢谢。

【问题讨论】:

  • STATUS_DLL_INIT_FAILED 在this blog post 中专门提到了有关桌面的内容。请注意 CreateDesktopEx() 如何允许您设置桌面堆的大小。很难看出这与服务帐户有何关系,可能是死胡同。
  • 感谢您的信息。我用大桌面堆尝试了 CreateDesktopEx(),但没有帮助。

标签: windows session service desktop uxtheme


【解决方案1】:

您需要使用 CrateDesktopEx 并增加堆的大小——即使对于记事本,默认值也是不够的。

【讨论】:

  • 这是重复的。版主,请删除。
猜你喜欢
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 2019-06-08
  • 2019-01-23
  • 2013-09-21
  • 2021-06-15
  • 2019-06-12
相关资源
最近更新 更多