動的リンクのRun-Time

アプリケーションが LoadLibrary 関数または LoadLibraryEx 関数を呼び出すと、システムは DLL の検索を試みます (詳細については、「ダイナミック リンク ライブラリの検索順序」を参照してください)。 検索が成功した場合、システムは DLL モジュールをプロセスの仮想アドレス空間にマップし、参照カウントをインクリメントします。 LoadLibrary または LoadLibraryEx呼び出しで、呼び出し元プロセスの仮想アドレス空間にコードが既にマップされている DLL が指定されている場合、関数は単に DLL へのハンドルを返し、DLL 参照カウントをインクリメントします。 ベース ファイル名と拡張子が同じで、ディレクトリが異なる 2 つの DLL は、同じ DLL とは見なされないことに注意してください。

システムは、 LoadLibrary または LoadLibraryEx を呼び出したスレッドのコンテキストでエントリ ポイント関数を呼び出 します。 FreeLibrary 関数への対応する呼び出しがない LoadLibrary または LoadLibraryEx の呼び出しによって DLL がプロセスによって既に読み込まれている場合、エントリ ポイント関数は呼び出されません。

システムで DLL が見つからない場合、またはエントリ ポイント関数が FALSE を返す場合、 LoadLibrary または LoadLibraryEx は NULL を返します。 LoadLibrary または LoadLibraryEx が成功すると、DLL モジュールにハンドルが返されます。 このプロセスでは、このハンドルを使用して、GetProcAddress、FreeLibrary、または FreeLibraryAndExitThread 関数の呼び出しで DLL を識別できます。

GetModuleHandle 関数は、GetProcAddress、FreeLibrary、または FreeLibraryAndExitThread で使用されるハンドルを返します。 GetModuleHandle 関数は、読み込み時間のリンクまたは LoadLibrary または LoadLibraryEx の以前の呼び出しによって、DLL モジュールがプロセスのアドレス空間に既にマップされている場合にのみ成功します。 LoadLibrary または LoadLibraryEx とは異なり、GetModuleHandle ではモジュール参照カウントはインクリメントされません。 GetModuleFileName 関数は、GetModuleHandleLoadLibrary、または LoadLibraryEx によって返されるハンドルに関連付けられているモジュールの完全なパスを取得します

このプロセスでは、GetProcAddress を使用して、LoadLibrary または LoadLibraryExGetModuleHandle によって返される DLL モジュール ハンドルを使用して、DLL 内のエクスポートされた関数のアドレスを取得できます。

DLL モジュールが不要になったら、プロセスで FreeLibrary または FreeLibraryAndExitThread を呼び出すことができます。 これらの関数は、モジュール参照カウントをデクリメントし、参照カウントが 0 の場合は、プロセスの仮想アドレス空間から DLL コードのマップを解除します。

実行時の動的リンクを使用すると、DLL が使用できない場合でも、プロセスの実行を続行できます。 その後、プロセスは別の方法を使用してその目的を達成できます。 たとえば、プロセスが 1 つの DLL を見つけられない場合は、別の DLL を使用しようとしたり、エラーをユーザーに通知したりできます。 ユーザーが不足している DLL の完全なパスを指定できる場合、プロセスはこの情報を使用して DLL を読み込むことができます。ただし、通常の検索パスには存在しません。 この状況は、読み込み時のリンクとは対照的であり、DLL が見つからない場合、システムは単にプロセスを終了します。

LoadLibrary または LoadLibraryEx が呼び出される前に存在していたスレッドに対してエントリ ポイントが呼び出されないため、DLL が DllMain 関数を使用してプロセスの各スレッドの初期化を実行すると、実行時の動的リンクが問題を引き起こす可能性があります。 この問題に対処する方法を示す例については、「 Dynamic-Link ライブラリでのスレッド ローカル ストレージの使用」を参照してください。

実行時の動的リンクの使用