__declspec(dllexport) を使った DLL からのエクスポート
__declspec(dllexport)
キーワードを使用すると、データ、関数、クラス、クラスのメンバー関数を DLL からエクスポートできます。 __declspec(dllexport)
では、オブジェクト ファイルにエクスポート ディレクティブが追加されるので、.def ファイルを使用する必要はありません。
この機能は、C++ 関数の装飾名をエクスポートする場合に特に便利です。 名前の装飾には標準仕様がないので、エクスポート関数の名前は、コンパイラのバージョン間で変わる場合があります。 __declspec(dllexport)
を使用する場合は、名前付け規則の変更に対応するためだけに、DLL とその従属する .exe ファイルを再コンパイルする必要があります。
序数、NONAME、PRIVATE など、多くのエクスポート ディレクティブは、.def ファイル内にしか作成されないので、これらの属性を .def ファイルを使用せずに指定することはできません。 ただし、.def ファイルに加えて __declspec(dllexport)
を使用すると、ビルド エラーが発生しません。
関数をエクスポートするには、呼び出し規則キーワードが指定されている場合、__declspec(dllexport)
キーワードは呼び出し規則キーワードの左に記述します。 次に例を示します。
__declspec(dllexport) void __cdecl Function1(void);
クラス内のすべてのパブリック データ メンバーおよびメンバー関数をエクスポートするには、次のように、クラス名の左にキーワードを記述します。
class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };
Note
__declspec(dllexport)
は、__clrcall
呼び出し規則を伴う関数には適用できません。
DLL のビルド時には通常、エクスポートする関数のプロトタイプやクラスを含むヘッダー ファイルを作成し、そのヘッダー ファイル内の宣言に __declspec(dllexport)
を追加します。 コードを読みやすくするために、次のように __declspec(dllexport)
用のマクロを定義して、そのマクロをエクスポートする各シンボルに使用します。
#define DllExport __declspec( dllexport )
__declspec(dllexport)
では、関数名は DLL のエクスポート テーブルに格納されます。 テーブル サイズの最適化方法については、「名前ではなく序数値による DLL 関数のエクスポート」を参照してください。