2013-11-19 2 views
0

У меня есть служба 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.

У любого есть идеи, почему он не работает с нестандартным рабочим столом, хорошо работая с рабочим столом по умолчанию?

Спасибо.

+0

STATUS_DLL_INIT_FAILED специально упоминается в [этом сообщении блога] (http://blogs.technet.com/b/askperf/archive/2007/07/24/sessions-desktops-and-windows-stations.aspx) о рабочих столах , Обратите внимание, что CreateDesktopEx() позволяет задать размер рабочей области. Как это связано с учетной записью службы, трудно увидеть, возможно, мертвый переулок. –

+0

Спасибо за информацию. Я попробовал CreateDesktopEx() с большой рабочей кучей, но это не помогло. – Alex

ответ

0

Вам необходимо использовать CrateDesktopEx и увеличить размер кучи - по умолчанию недостаточно даже для блокнота.

+0

Это дубликат. Модератор, пожалуйста, удалите его. –