インポートとエクスポート
次の 2 つの方法を使用して、パブリック シンボルをアプリケーションにインポートしたり、DLL から関数をエクスポートしたりすることができます。
DLL をビルドするときにモジュール定義 (.def) ファイルを使用する
メイン アプリケーションの関数定義でキーワード
__declspec(dllimport)
または__declspec(dllexport)
を使用する
.def ファイルの使用
モジュール定義ファイル (.def) は、テキスト ファイルです。DLL のさまざまな属性を記述する 1 つ以上のモジュール文が含まれています。 DLL の関数をエクスポートするために __declspec(dllimport)
または __declspec(dllexport)
を使用しない場合、DLL には .def ファイルが必要です。
.def ファイルを使用して、アプリケーションにインポートするか、DLL からエクスポートすることができます。
__declspec の使用
コードを正しくコンパイルするために __declspec(dllimport)
を使用する必要はありませんが、使用するとコンパイラによってより適切なコードが生成されます。 コンパイラは、関数が DLL に存在するかどうかを判別できるため、より優れたコードを生成できます。これにより、コンパイラは、DLL 境界を越えた関数呼び出しに通常存在する間接参照のレベルをスキップするコードを生成できます。 ただし、DLL で使用されている変数をインポートするには、__declspec(dllimport)
を使用する必要があります。
適切な .def ファイルの EXPORTS セクションを使用する場合、__declspec(dllexport)
は不要です。 __declspec(dllexport)
は、.def ファイルを使用せずに .exe または .dll ファイルから関数をエクスポートする簡単な方法を提供するために追加されました。
Win32 ポータブル実行可能形式は、インポートを修正するために操作する必要があるページ数を最小限に抑えるように設計されています。 これを行うには、プログラムのすべてのインポート アドレスを、インポート アドレス テーブルという 1 か所に配置します。 これにより、ローダーでは、これらのインポートにアクセスするときに 1 ページまたは 2 ページのみを変更できます。