9

このコードに似たCreateProcessAsUser()APIを使用して、サービスからユーザーモードプロセスを開始しようとしています。私のコードは99%の時間で正常に動作しますが、APIが成功する場合を除いて、PROCESS_INFORMATION構造体からプロセスハンドルを取得しますが、プロセス自体は、実行する予定のインタラクティブユーザーセッションに表示されません。

興味深いのは、プロセスハンドルでGetExitCodeProcess()を呼び出すと、リターンコード0xC0000142で成功することです。なぜですか?

4

2 に答える 2

9

エラー0xC0000142はSTATUS_DLL_INIT_FAILEDエラーコードルックアップツールを使用してこれを決定しました)です。簡単なグーグルがこの質問を見つけました、それは言います:

この問題の最も一般的な原因は、にリンクするプログラムがuser32.dll、システムのウィンドウステーションおよびデスクトップと通信できないコンテキストで実行されたことです。通常、エージェントなどのサービスは独自のウィンドウステーションとデスクトップで実行され、user32プログラムは正常に実行されますが、ダイアログボックスを表示したプログラムは、人間がエラーメッセージを表示したり、ダイアログを閉じたりする機会がなくてもハングします。 。

したがって、から関数を使用していない場合user32.dllは、その依存関係を削除する必要があります。そのDLLを使用している場合は、何をすべきかよくわかりません。1つのオプションは、DLLを動的にロードし、LoadLibrary成功した場合(つまり、有効なウィンドウセッションがある場合)に使用するか、失敗した場合に失敗モードにフォールバックすることです。

于 2012-11-16T22:25:16.137 に答える
7

CreateProcess ...()APIは、内部プロセスオブジェクトを正常に作成して初期化を開始できる場合、TRUEを返します。プロセスがロードされ、実行可能イメージの実行が開始されるのを待ちません。後で初期化が失敗する場合もありますが、カーネルの観点からは、それでもプロセスの作成は成功しました。

于 2012-11-16T23:03:36.277 に答える