エクスポート方式の使い分け

関数は .def ファイルか __declspec(dllexport) キーワードでエクスポートできます。 自分の DLL に最適な方法を判断するとき、以下の質問について検討すると役立ちます。

  • エクスポートする関数は後で増える予定ですか。

  • DLL は、再構築できるアプリケーションでのみ利用されますか、それとも、再構築できないアプリケーション、たとえば、サード パーティ製のアプリケーションで利用されますか。

.def ファイル使用の利点と欠点

.def ファイルで関数をエクスポートすると、エクスポートの順序を制御できます。 エクスポートした関数を DLL に追加するとき、エクスポートされた他の関数より上の順序値を割り当てることができます。 そのとき、暗黙的なリンクを利用するアプリケーションでは、新しい関数が含まれるインポート ライブラリを再リンクする必要がありません。 これは、さまざまなアプリケーションで利用される DLL の設計時に非常に便利です。新しい機能を追加するとき、その機能は、それに既に依存しているアプリケーションと引き続き正しく連動するためです。 たとえば、MFC DLL は .def ファイルを利用して構築されます。

.def ファイルを利用するもう 1 つの利点は、NONAME 属性を利用して関数をエクスポートできることです。 そのとき、エクスポート テーブルの順序のみが DLL に入ります。 エクスポートされる関数の数が多い DLL の場合、NONAME 属性を利用すると、DLL ファイルのサイズを削減できます。 モジュール定義ステートメントを記述する方法については、「モジュール定義ステートメントに関する規則」を参照してください。 順序によるエクスポートについては、「名前ではなく序数値による DLL 関数のエクスポート」を参照してください。

.def ファイル利用の欠点は、C++ ファイルで関数をエクスポートする場合、.def ファイルに修飾名を入れるか、MSVC コンパイラの名前修飾を回避する目的で、エクスポートされる関数を extern "C" を使用して定義する必要があります。

.def ファイルに装飾名を入れる場合、装飾名を取得するには、DUMPBIN ツールか /MAP リンカー オプションを使用します。 コンパイラで生成される修飾名はコンパイラ固有です。そのため、コンパイラで生成された修飾名を .def ファイルに入れる場合、呼び出し元アプリケーションの修飾名が DLL の .def ファイルのエクスポート名に一致するよう、DLL にリンクされるアプリケーションも同じバージョンのコンパイラを使用して構築する必要があります。

__declspec(dllexport) 使用の利点と欠点

__declspec(dllexport) を使用するときは、.def ファイルを維持し、エクスポートされる関数の修飾名を取得する必要がないため、便利です。 ただし、このエクスポート方法が便利かどうかは、リンクされているアプリケーションを再構築する件数によります。 新しいエクスポートで DLL を再構築する場合、アプリケーションも再構築する必要があります。別バージョンのコンパイラを利用して再構築する場合、エクスポートされる C++ 関数の修飾名が変わることがあるためです。

目的に合ったトピックをクリックしてください

さらに詳しくは次のトピックをクリックしてください

関連項目

DLL からのエクスポート