【发布时间】: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