У меня есть служба Windows (работает под управлением Windows Vista +), которая должна запускать обычное графическое приложение. По какой-то причине мне нужно запустить приложение GUI на рабочем столе, отличном от стандартного (конечно, поскольку он запущен сервисом, он запускается в сеансе 0, WinSta0, но не на рабочем столе по умолчанию).Не удалось загрузить user32.dll при запуске процесса, выполняющегося на рабочем столе, отличном от стандартного, в сеансе 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 специально упоминается в [этом сообщении блога] (http://blogs.technet.com/b/askperf/archive/2007/07/24/sessions-desktops-and-windows-stations.aspx) о рабочих столах , Обратите внимание, что CreateDesktopEx() позволяет задать размер рабочей области. Как это связано с учетной записью службы, трудно увидеть, возможно, мертвый переулок. –
Спасибо за информацию. Я попробовал CreateDesktopEx() с большой рабочей кучей, но это не помогло. – Alex