LoadLibrary と AfxLoadLibrary
プロセスでは、DLL に明示的にリンクするために、LoadLibrary または LoadLibraryEx が呼び出されます (MFC アプリは AfxLoadLibrary または AfxLoadLibraryEx を使用します)。この関数が正常終了した場合、呼び出し元プロセスのアドレス空間に指定された DLL が割り当てられ、DLL へのハンドルが返されます。 このハンドルは、GetProcAddress
や FreeLibrary
など、明示的リンクに必要な他の関数で使用できます。 詳細については、明示的リンクに関するセクションを参照してください。
LoadLibrary
は、暗黙リンクと同じ検索シーケンスで DLL を探します。 LoadLibraryEx
を使用すると、検索パスの順序をより細かく制御できます。 詳細については、ダイナミック リンク ライブラリの検索順序に関するページを参照してください。 システムが DLL を見つけられない場合、またはエントリ ポイント関数が FALSE を返した場合、LoadLibrary
は NULL を返します。 LoadLibrary
への呼び出しで指定される DLL モジュールが呼び出し元プロセスのアドレス空間に既に割り当てられている場合、この関数は DLL のハンドルを返し、モジュールの参照カウントをインクリメントします。
DLL にエントリ ポイント関数が含まれる場合、オペレーティング システムは、LoadLibrary
または LoadLibraryEx
を呼び出したスレッドのコンテキスト内でその関数を呼び出します。 DLL が既にプロセスにアタッチされている場合、エントリポイント関数は呼び出されません。 これは、DLL の LoadLibrary
または LoadLibraryEx
への以前の呼び出し時に、対応する FreeLibrary
関数への呼び出しがなかった場合に発生します。
拡張 DLL を読み込む MFC アプリケーションでは、LoadLibrary
または LoadLibraryEx
の代わりに AfxLoadLibrary
または AfxLoadLibraryEx
を使用することをお勧めします。 MFC 関数は、DLL を明示的に読み込む前にスレッドの同期を処理します。 AfxLoadLibrary
と AfxLoadLibraryEx
に対するインターフェイス (関数プロトタイプ) は、LoadLibrary
と LoadLibraryEx
に対するものと同じです。
Windows が DLL を読み込むことができない場合は、プロセスでエラーからの回復を試みることができます。 たとえば、ユーザーにエラーを通知し、DLL への別のパスを要求することができます。
重要
DLL の完全パスを指定してください。 LoadLibrary
によってファイルが読み込まれるときに、現在のディレクトリが最初に検索される場合があります。 ファイルのパスを完全に指定しないと、意図したファイルでないファイルが読み込まれる可能性があります。 DLL を作成するときは、/DEPENDENTLOADFLAG リンカー オプションを使用して、静的にリンクされた DLL の依存関係の検索順序を指定します。 DLL 内では、依存関係を明示的に読み込むための完全なパスと、モジュールの検索順序を指定するための呼び出しパラメーター LoadLibraryEx
または AfxLoadLibraryEx
を使用します。 詳細については、ダイナミック リンク ライブラリのセキュリティとダイナミック リンク ライブラリの検索順序に関するページを参照してください。