2013-08-21 3 views
6

私はCreateProcessを呼び出しています。 CreateProcessは成功を示す0以外を返します。しかし、プロセスへのハンドルはすぐに取得され、プロセスが終了したことを示します。 GetExitCodeProcessに電話すると、STATUS_DLL_NOT_FOUNDが返されます。CreateProcess STATUS_DLL_NOT_FOUND - どのDLLですか?

私はDLLがないことを理解します。私は正確にどちらがどれかを知っています。しかし、私が理解していないことは、プログラムでそれを理解する方法です。

Windowsが、指定されたDLL(screenshot:http://www.mediafire.com/view/?kd9ddq0e2dlvlb9)を見つけられなかったため、プロセスの開始に失敗したというダイアログが表示されました。ダイアログで、Windowsは、欠落しているDLLを指定します。しかし、私はプログラムで自分自身でその情報を取得する方法はないと思います。

プロセスが開始されずにSTATUS_DLL_NOT_FOUNDが返された場合、ターゲットプロセスがリンクされているライブラリ名をプログラムで見つけられませんでした。こうすることで、特定のインストールでDLLが見つからないか壊れているように見えるエラーレポートを自動的に記録できます。

+1

私は答えを知りたがっています。 Dependency Walkerはそれを行いますが、デバッグAPIを使用しており、別のプロセスと多くのジャンプを必要とします。 (プロセスが無人で実行され、ハングアップするのではなく正常に失敗するような場合など、ダイアログをオフにすることができます) –

+2

重複がありますか? http://stackoverflow.com/questions/597260/how-to-determine-a-windows-executables-dll-dependencies-programatically –

+1

これはあなたの質問に答えることはできませんが、['SetErrorMode()'] (http://msdn.microsoft。DLLが読み込みに失敗したときにWindowsがエラーメッセージダイアログを表示するかどうかを制御するための関数(com/library/ms680621)ただし、エラーダイアログに表示されるデータにアクセスする方法はありません。 –

答えて

1

非常に難しい方法は:.EXEファイルと.DLLファイルを解析し、.DLLファイルの依存関係ツリーを作成することです。

欠けているDLLファイルのリストを取得する方法はないと思います:Windowsが見つからないDLLファイルが1つ見つかったら、読み込みが中断されて1つのDLLファイルが見つからない場合は、ファイルがありません。

もう1つ問題があると、古いDLLバージョンに「エクスポート」(機能)がない可能性があります。これは、依存ツリーよりも検出がさらに困難です。

+0

これは99.9%の時間で動作しますが、これは実行時に 'LoadLibrary'でロードされたdllを見つけられないことに注意してください。 –

+0

@MooingDuck:これは間違いありません。実行時にDLLが呼び出されると、CreateProcess()はすでに正常に返されています。 –

2

dllが静的にリンクされている場合、iatを歩いてdllが存在するかどうかを確認できます。 dllが動的にロードされている場合、プロセスの中断を開始し、LoadLibraryをフックする(またはデバッガをエミュレートする代わりに)私が見る唯一の方法です。

4

成功を示す0が返されます。

CreateProcess()失敗ではない成功別名、0がFALSEあるBOOLを返します。

プロセスが開始に失敗し、STATUS_DLL_NOT_FOUNDが返された場合、ターゲットプロセスがリンクされているライブラリ名をプログラムで見つけられませんでした。

残念ながら、APIはありません。唯一のオプションは、実行可能ファイルのIMPORTSテーブルに手動でアクセスして列挙して、使用するDLLを調べ、そのIMPORTSテーブルに再帰的にアクセスして列挙し、そのDLLファイルがオペレーティングシステムの検索に存在するかどうかパスかどうか。

+0

自分のコードを二重にチェックしてください。そうです。私は頭の上からそれを引用していた。 CreateProcess()は成功を示す0以外を返します。 yay convoluted invocationsとifステートメント間違いなくGetExitCodeProcess()はSTATUS_DLL_NOT_FOUNDを返しています。 頭がおかげでありがとう。私は上司に悪い知らせをさせなければならない。 – Keith4G

関連する問題