Dependency Walkerは、静的な DLL の依存関係 (EXE のインポート テーブルに参照がある場所) のみを表示できます。DLL が実行時にLoadLibrary
(または遅延読み込み -- を使用して/delayload
) 読み込まれた場合、Dependency Walkerはこれを認識できません。
#import
実際には、DLL に静的な依存関係を課すことはありません。コンパイル時に DLL から COM タイプ ライブラリ情報を読み込みます。これは、タイプ ライブラリで定義されている COM クラスとインターフェイスの C++ バインディングに変換されます。これらは、またはディレクトリ内の.tli
および.tlh
ファイルとして表示できます。DLL ファイルを削除できる可能性があり、これらのファイルがまだ存在する限り、VS はプロジェクトを正常にビルドし続ける可能性があります。Debug
Release
同様に、実行時に、#import
実際には DLL に静的な依存関係を課さない (つまり、DLL を EXE のインポート テーブルに追加しない) ため、Dependency Walkerはこの依存関係を認識できません。
ただし、実行時に EXE は (間接的に) を呼び出しLoadLibrary
、(DLL が見つからない場合) これにより実行時にエラーが発生し、プログラムが適切に処理するか、プログラムがクラッシュする可能性があります。
とはいえ、#import
単に COM タイプ ライブラリをインポートするだけです。COM タイプ ライブラリは、COM オブジェクトで使用されるインターフェイスと、CLSID
それらのオブジェクトの値を定義します。COM オブジェクトを実装するコードを見つけるために、CLSID
値はレジストリを使用して解決されます( HKEY_CLASSES_ROOT\CLSID
.
これは、DLL が実行時に必要とされないことさえあることを意味します。ただ、これは珍しいと思います。
さらに、COM オブジェクトはアウト プロセス オブジェクトとして実装される場合があります (別の EXE が読み込まれることを意味します)。この場合、プロセスに読み込まれるのは、関連するインターフェイス用に構成されたプロキシ/スタブ DLL だけです。多くの場合、これらは TLB を使用して定義されます (この場合、#import
-ed DLL がロードされます)。しかし、完全に異なる DLL で実装されている可能性があります。どちらの方法でも、DLL は動的に読み込まれます。つまり、Dependency Walkerはそれを認識しません。
プロセスによって読み込まれる DLL を確認するには、 SysInternals Process MonitorやProcess Explorerなどが必要です。