Не удалось загрузить user32.dll при запуске процесса, запущенного на рабочем столе не по умолчанию, в сеансе 0 Winsta0
У меня есть служба Windows (работает на Windows Vista+), которая должна запустить обычное приложение с графическим интерфейсом. По какой-то причине мне нужно запустить приложение с графическим интерфейсом на рабочем столе не по умолчанию (конечно, поскольку оно запускается процессом службы, оно запускается в сеансе 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 не загружались при работе с учетной записью SYSTEM, первая из них - uxTheme.dll.
У кого-нибудь есть идеи, почему он не работает с рабочим столом не по умолчанию, а работает хорошо с рабочим столом по умолчанию?
Благодарю.
1 ответ
Вам нужно использовать CrateDesktopEx и увеличить размер кучи - по умолчанию недостаточно даже для блокнота.