Windows 在会话0 Winsta0中启动在非默认桌面上运行的进程时,加载user32.dll失败

Windows 在会话0 Winsta0中启动在非默认桌面上运行的进程时,加载user32.dll失败,windows,session,service,desktop,uxtheme,Windows,Session,Service,Desktop,Uxtheme,我有一个Windows服务(在Windows Vista+上运行),它需要启动一个普通的GUI应用程序。出于某种原因,我需要在非默认桌面上运行GUI应用程序(当然,因为它是由服务进程启动的,所以它在会话0 WinSta0中运行,但不在默认桌面上运行) 代码如下所示 // create new desktop hDesktop = CreateDesktop(NEW_DESKTOP, 0, 0 ,0, DESKTOP_SWITCHDESKTOP | DESKTOP_WRITEOBJ

我有一个Windows服务(在Windows Vista+上运行),它需要启动一个普通的GUI应用程序。出于某种原因,我需要在非默认桌面上运行GUI应用程序(当然,因为它是由服务进程启动的,所以它在会话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
我搜索了一会儿,好像是安全问题。我试图将所有与桌面相关的权限授予当前用户,但没有帮助

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

有人知道为什么它不能与非默认桌面协同工作,而与默认桌面协同工作吗


谢谢。

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

STATUS\u DLL\u INIT\u FAILED在关于桌面中特别提到。请注意CreateDesktopEx()如何允许您设置桌面堆的大小。很难看出这与服务帐户的关系,可能是一条死胡同。谢谢你提供的信息。我试着用大桌面堆创建CreateDesktopEx(),但没有用。它是重复的。主持人,请删除它。