コンポーネント カテゴリ マネージャを使用して、特定のカテゴリを実装するすべてのクラスをロードするコードがあります。
読み込まれた DLL または EXE から説明、パス、およびバージョン情報を取得する簡単な方法はありますか?
コンポーネント カテゴリ マネージャを使用して、特定のカテゴリを実装するすべてのクラスをロードするコードがあります。
読み込まれた DLL または EXE から説明、パス、およびバージョン情報を取得する簡単な方法はありますか?
オブジェクトが同じアパートメント内のインプロセス (つまり DLL から) に読み込まれる場合、メモリ内の DLL を見つけるためにいくつかのトリックを実行できる可能性があります。たとえば、ライブ オブジェクトへのコード ポインターを仮想メソッド テーブル (vtable) で調べると、通常は DLL を指します。その後、いくつかのシステム コールを使用して、そのコードがどのロード済み DLL の一部であるかを判断できます。
しかし、多くの潜在的な落とし穴があります。これらのオブジェクトを別のアパートメントにロードする必要がある場合、コード ポインターは実際のコードではなくスタブを指します。また、多くの COM ライブラリは、ランタイムによって提供されるラッパー クラスに共通のインターフェイスを実際に実装しているため、多くの一般的なユース ケースで誤った情報を提供する可能性が高くなります。(つまり、ランタイム DLL (通常は MFC または ATL) の情報を取得することになります)。
オブジェクトがプロセス外で (つまり、EXE から) ロードされた場合、どの EXE がライブ オブジェクトに対応するかを追跡するもっともらしい方法がわかりません。(明らかに、このデータはプロセスまたは COM ランタイムのどこかに存在する必要がありますが、スタブの下のどこかに埋め込まれており、実行している Windows のバージョンに依存している可能性があります)。
したがって、非常に制限された一連のオブジェクト (同じアパートメントに読み込まれるすべてのインプロセス) を見ている場合を除き、おそらく最善の策は、レジストリの登録情報を使用して必要なものを検索することです。これは、OS のバージョンごとに変更される可能性のあるものの 1 つであるため厄介ですが、幸いなことに、COM は十分に長く存在しているため、これは何年にもわたって大幅に変更されていません。
Component Categories Managerから取得したオブジェクトの CLSID を指定すると、対応するバイナリ ファイルを次のように検索します。
HKEY_CLASSES_ROOT\CLSID\{xxxxxxxxx-yyyyy-zzzz-aaaa-bbbbbbbbbbbbbb
}中かっこ内の文字列は、検索するオブジェクトの CLSID です。REG_SZ
には、必要な DLL へのフル パスが含まれています。REG_SZ
場合によっては、コマンド ライン スイッチをこの文字列から切り離して、EXE パスだけを取得する必要があります。この情報を取得する 1 つの方法は、ログの目的でのみ使用されると仮定すると、すべての初期化が完了するまで待機し、ロードされたモジュールを列挙して、それぞれの詳細をログ ファイルにダンプすることです。
明らかに、これはインプロセス オブジェクトに対してのみ機能し、アプリケーションが非常に動的な場合は機能しませんが、COM 以外の DLL もキャッチします。