EXPORTS

更新 : 2007 年 11 月

エクスポートされた関数またはデータである 1 つ以上の definitions のセクションを導入します。各定義は、それぞれ別の行に記述する必要があります。

EXPORTS
definitions

解説

EXPORTS キーワードを記述する場所は、最初の定義と同じ行でもその前の行でもかまいません。.def ファイルには、複数の EXPORTS ステートメントを記述できます。

エクスポートの definitions の構文は、次のとおりです。

entryname[=internalname] [@ordinal [NONAME]] [PRIVATE] [DATA]

entryname は、エクスポートする関数または変数の名前です。この指定は必須です。エクスポートする名前が DLL における名前と異なる場合は、internalname で DLL におけるエクスポートの名前を指定します。たとえば、DLL がエクスポートした関数 func1() を func2() として使用する場合は、次のように指定します。

EXPORTS
func2=func1

@ordinal を指定すると、関数名ではなく数値が DLL のエクスポート テーブルに格納されます。これは、DLL のサイズを最小限に抑えるのに役立ちます。.LIB ファイルには序数と関数の間のマップが含まれており、DLL を使用するプロジェクトの中では、通常と同じように関数名を使用できます。

省略可能な NONAME キーワードを使うと、序数だけをエクスポートでき、生成される DLL のエクスポート テーブルのサイズを抑えることができます。ただし、DLL で GetProcAddress を使用する場合は、名前は使用できないため、序数がわかっている必要があります。

省略可能なキーワード PRIVATE を指定すると、entryname は LINK で生成されるインポート ライブラリに取り込まれません。同じく LINK で生成される、イメージ中のエクスポートに対しては影響がありません。

省略可能なキーワード DATA は、エクスポートがコードではなくデータであることを指定します。たとえば、次のようにデータ変数をエクスポートできます。

EXPORTS
i DATA

同じエクスポートに対して PRIVATEDATA を使用する場合は、DATA より前に PRIVATE を置く必要があります。

定義をエクスポートするには、次の 3 とおりの方法 (推奨順) があります。

  1. ソース コードで __declspec(dllexport) キーワードを使う。

  2. .def ファイルで EXPORTS ステートメントを使う。

  3. LINK コマンドで、/EXPORT 指定を使う。

同じプログラムでこの 3 つの方法すべてを使用できます。エクスポートを含むプログラムを LINK でビルドすると、インポート ライブラリも同時に作成されます。ただし、ビルドで .exp ファイルが使用されている場合は除きます。

以下に EXPORTS セクションの例を示します。

EXPORTS
   DllCanUnloadNow      @1     PRIVATE   DATA
   DllWindowName = Name        DATA
   DllGetClassObject    @4 NONAME   PRIVATE
   DllRegisterServer    @7
   DllUnregisterServer

.def ファイルで DLL から変数をエクスポートする場合は、変数に対して __declspec(dllexport) を指定する必要はありません。ただし、DLL を使用するファイルでは、データの宣言に対して __declspec(dllimport) を使用する必要があります。

参照

参照

モジュール定義ステートメントに関する規則