インポートとエクスポート
次の 2 つの方法を使って、アプリケーションにパブリック シンボルをインポートしたり、DLL から関数をエクスポートしたりできます。
DLL をビルドするときにモジュール定義 (.def) ファイルを使用します。
メイン アプリケーションの関数定義で、__declspec(dllimport) キーワードまたは __declspec(dllexport) キーワードを使用します。
.def ファイルの使用
モジュール定義ファイル (.def) は、テキスト ファイルです。DLL のさまざまな属性を記述する 1 つ以上のモジュール文が含まれています。__declspec(dllexport) キーワードまたは __declspec(dllexport) キーワードを使わずに DLL の関数をエクスポートする場合は、DLL に .def ファイルが必要です。
.def ファイルを使うと、アプリケーションへのインポートや DLL からのエクスポートを行うことができます。
__declspec の使用
Visual C++ では、Visual C++ の 16 ビット版で使用されていた __export キーワードの代わりに、__declspec(dllimport) と __declspec(dllexport) を使用します。
__declspec(dllimport) を使用しなくてもコードは正しくコンパイルされますが、使用した方がコードがより洗練されます。__declspec(dllimport) を使うと、ある関数が DLL 内にあるかないかをコンパイラが判断できるようになり、その結果、コードでは通常 DLL の境界を越える関数呼び出し内に存在する間接操作のレベルをスキップできます。ただし、DLL 内に変数をインポートするには、__declspec(dllimport) を必ず使用する必要があります。
.def ファイルの EXPORT セクションが適切な場合、__declspec(dllexport) は不要です。__declspec(dllexport) を追加すると、.def ファイルを使わなくても .exe または .dll から関数を簡単にエクスポートできます。
Win32 移植可能実行可能形式は、インポートを固定するために参照しなければならないページ数を最小限に抑えるようにデザインされています。このために、あらゆるプログラム用のインポート アドレス全部をインポート アドレス テーブルという場所にまとめています。こうすることで、ローダーはインポートにアクセスするときに 1 ページか 2 ページを変更するだけで済みます。