__declspec(dllexport) を使った DLL からのエクスポートExporting from a DLL Using __declspec(dllexport)

__declspec(dllexport) キーワードを使用すると、データ、関数、クラス、クラスのメンバー関数を DLL からエクスポートできます。You can export data, functions, classes, or class member functions from a DLL using the __declspec(dllexport) keyword. __declspec(dllexport) では、オブジェクト ファイルにエクスポート ディレクティブが追加されるので、.def ファイルを使用する必要はありません。__declspec(dllexport) adds the export directive to the object file so you do not need to use a .def file.

この機能は、C++ 関数の装飾名をエクスポートする場合に特に便利です。This convenience is most apparent when trying to export decorated C++ function names. 名前の装飾には標準仕様がないので、エクスポート関数の名前は、コンパイラのバージョン間で変わる場合があります。Because there is no standard specification for name decoration, the name of an exported function might change between compiler versions. __declspec(dllexport) を使用する場合は、名前付け規則の変更に対応するためだけに、DLL とその従属する .exe ファイルを再コンパイルする必要があります。If you use __declspec(dllexport), recompiling the DLL and dependent .exe files is necessary only to account for any naming convention changes.

序数、NONAME、PRIVATE など、多くのエクスポート ディレクティブは、.def ファイル内にしか作成されないので、これらの属性を .def ファイルを使用せずに指定することはできません。Many export directives, such as ordinals, NONAME, and PRIVATE, can be made only in a .def file, and there is no way to specify these attributes without a .def file. ただし、.def ファイルに加えて __declspec(dllexport) を使用すると、ビルド エラーが発生しません。However, using __declspec(dllexport) in addition to using a .def file does not cause build errors.

関数をエクスポートするには、呼び出し規則キーワードが指定されている場合、 __declspec(dllexport) キーワードは呼び出し規則キーワードの左に記述します。To export functions, the __declspec(dllexport) keyword must appear to the left of the calling-convention keyword, if a keyword is specified. 次に例を示します。For example:

__declspec(dllexport) void __cdecl Function1(void);

クラス内のすべてのパブリック データ メンバーおよびメンバー関数をエクスポートするには、次のように、クラス名の左にキーワードを記述します。To export all of the public data members and member functions in a class, the keyword must appear to the left of the class name as follows:

class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };


__declspec(dllexport) は、__clrcall 呼び出し規則を伴う関数には適用できません。__declspec(dllexport) cannot be applied to a function with the __clrcall calling convention.

DLL のビルド時には通常、エクスポートする関数のプロトタイプやクラスを含むヘッダー ファイルを作成し、そのヘッダー ファイル内の宣言に __declspec(dllexport) を追加します。When building your DLL, you typically create a header file that contains the function prototypes and/or classes you are exporting and add __declspec(dllexport) to the declarations in the header file. コードを読みやすくするために、次のように __declspec(dllexport) 用のマクロを定義して、そのマクロをエクスポートする各シンボルに使用します。To make your code more readable, define a macro for __declspec(dllexport) and use the macro with each symbol you are exporting:

#define DllExport   __declspec( dllexport )

__declspec(dllexport) では、関数名は DLL のエクスポート テーブルに格納されます。__declspec(dllexport) stores function names in the DLL's export table. テーブル サイズの最適化方法については、「名前ではなく序数値による DLL 関数のエクスポート」を参照してください。If you want to optimize the table's size, see Exporting Functions from a DLL by Ordinal Rather Than by Name.

実行する操作What do you want to do?

さらに詳しくは次のトピックをクリックしてくださいWhat do you want to know more about?

関連項目See also

DLL からのエクスポートExporting from a DLL