EXPORTS
エクスポートされた関数またはデータである 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
同じエクスポートに対して PRIVATE と DATA を使用する場合は、DATA より前に PRIVATE を置く必要があります。
定義をエクスポートするには、次の 3 とおりの方法 (推奨順) があります。
ソース コードで __declspec(dllexport) キーワードを使う。
.def ファイルで EXPORTS ステートメントを使う。
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) を使用する必要があります。