0

我有一个 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。

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

谢谢。

4

1 回答 1

0

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

于 2016-08-24T16:07:43.070 回答