我有一个 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。
任何人都知道为什么它不能在非默认桌面上工作,而在默认桌面上工作得很好?
谢谢。