Dynamic-Link ライブラリについて

動的リンクを使用すると、読み込み時または実行時にエクスポートされた DLL 関数を見つけるために必要な情報のみをモジュールに含めることができます。 動的リンクは、より使い慣れた静的リンクとは異なり、リンカーはライブラリ関数のコードを呼び出す各モジュールにコピーします。

動的リンクの種類

DLL で関数を呼び出すには、次の 2 つのメソッドがあります。

  • 読み込み時の動的リンクでは、モジュールはエクスポートされた DLL 関数をローカル関数のように明示的に呼び出します。 これには、関数を含む DLL のインポート ライブラリにモジュールをリンクする必要があります。 インポート ライブラリは、DLL を読み込み、アプリケーションの読み込み時にエクスポートされた DLL 関数を検索するために必要な情報をシステムに提供します。
  • 実行時の動的リンクでは、モジュールは LoadLibrary または LoadLibraryEx 関数を使用して実行時に DLL を読み込みます。 DLL が読み込まれた後、モジュールは GetProcAddress 関数を呼び出して、エクスポートされた DLL 関数のアドレスを取得します。 モジュールは、 GetProcAddress によって返される関数ポインターを使用して、エクスポートされた DLL 関数を呼び出します。 これにより、インポート ライブラリが不要になります。

DLL とメモリ管理

DLL を読み込むすべてのプロセスは、それを仮想アドレス空間にマップします。 プロセスが DLL を仮想アドレスに読み込んだ後、エクスポートされた DLL 関数を呼び出すことができます。

システムは、各 DLL のプロセスごとの参照カウントを保持します。 スレッドが DLL を読み込むと、参照カウントが 1 ずつインクリメントされます。 プロセスが終了したとき、または参照カウントが 0 (実行時の動的リンクのみ) になると、DLL はプロセスの仮想アドレス空間からアンロードされます。

他の関数と同様に、エクスポートされた DLL 関数は、それを呼び出すスレッドのコンテキストで実行されます。 したがって、次の条件が適用されます。

  • DLL を呼び出したプロセスのスレッドは、DLL 関数によって開かれたハンドルを使用できます。 同様に、呼び出し元プロセスの任意のスレッドによって開かれたハンドルを DLL 関数で使用できます。
  • DLL は、呼び出し元スレッドのスタックと呼び出し元プロセスの仮想アドレス空間を使用します。
  • DLL は、呼び出し元プロセスの仮想アドレス空間からメモリを割り当てます。

DLL の詳細については、次のトピックを参照してください。