通常の GUI アプリケーションを起動する必要がある Windows サービス (Windows Vista 以降で実行) があります。何らかの理由で、デフォルト以外のデスクトップで GUI アプリケーションを実行する必要があります (もちろん、サービス プロセスによって起動されるため、セッション 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
しばらく検索したところ、セキュリティの問題に関連しているようです。デスクトップに関連するすべての権限を現在のユーザーに付与しようとしましたが、役に立ちませんでした。
1つのことが役立つ場合があります。SYSTEM アカウントで実行しているときにいくつかの DLL がロードされていないことに気付きました。最初の DLL は uxTheme.dll です。
デフォルトのデスクトップではうまく機能しているのに、デフォルト以外のデスクトップでは機能しない理由を知っている人はいますか?
ありがとう。