/EXPORT (関数のエクスポート)

関数を名前または序数 (またはデータ) でプログラムからエクスポートします。

構文

/EXPORT:<エントリ名>[,@<序数>[,NONAME]][,DATA]

解説

/EXPORT オプションを使うと、プログラムからエクスポートする関数またはデータ項目を指定できます。これにより、他のプログラムから関数を呼び出したり、データを使用したりできるようになります。 通常、エクスポートは DLL で定義されます。

<エントリ名> は、呼び出し元のプログラムによって使用される、関数またはデータ項目の名前です。 <序数> を使うと、1 から 65,535 の範囲でエクスポート テーブルへのインデックスを指定できます。<序数> を指定しない場合は、LINK によって割り当てられます。 NONAME キーワードを使用すると、関数はただ序数として、<エントリ名> なしでエクスポートされます。

DATA キーワードでは、エクスポートされた項目がデータ項目であることを指定できます。 クライアント プログラムのデータ項目は、extern __declspec(dllimport) を使って宣言する必要があります。

定義をエクスポートするには次の 4 つの方法があり、使用をお勧めする順に示します。

  1. ソース コードでの __declspec(dllexport)

  2. .def ファイルでの EXPORTS ステートメント

  3. LINK コマンドでの /EXPORT の指定

  4. ソース コードでの comment ディレクティブ (形式は #pragma comment(linker, "/export: definition "))。

同じプログラム内でこれらすべての方法を使用できます。 エクスポートを含むプログラムが LINK によってビルドされる際に、ビルドで .exp ファイルが使用されていない限り、インポート ライブラリも作成されます。

LINK では、識別子の装飾形式が使用されます。 コンパイラは、.obj ファイルを作成するときに識別子を装飾します。 <エントリ名> がリンカーに対して非装飾形式で (ソース コードに示されているように) 指定されている場合、LINK によって名前の照合が試みられます。 一意の一致が見つからない場合、LINK からエラー メッセージが表示されます。 リンカーに指定する必要がある場合は、DUMPBIN ツールを使って識別子の装飾名形式を取得します。

Note

__cdecl または __stdcall として宣言されている C 識別子の装飾形式は指定しないでください。

関数の非装飾名をエクスポートする必要があり、ビルドの構成 (たとえば、32 ビット ビルドか 64 ビット ビルドか) によってエクスポートが異なる場合は、構成ごとに異なる DEF ファイルを使用できます。 (プリプロセッサの条件付きディレクティブは DEF ファイルでは使用できません)。別の方法として、次に示すように、関数宣言の前にディレクティブを使用 #pragma comment できます。ここに PlainFuncName は、宣言されていない名前と _PlainFuncName@4 、関数の修飾名を指定します。

#pragma comment(linker, "/export:PlainFuncName=_PlainFuncName@4")
BOOL CALLBACK PlainFuncName( Things * lpParams)

Visual Studio 開発環境でこのリンカー オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。

  2. [構成プロパティ]>[リンカー]>[コマンド ライン] プロパティ ページを選択します。

  3. [追加のオプション] ボックスにオプションを入力します。

このリンカーをコードから設定するには

関連項目

MSVC リンカーのリファレンス
MSVC リンカー オプション