dllexport
、dllimport
Microsoft 固有の仕様
dllexport
および dllimport
ストレージ クラス属性は C 言語および C++ 言語への Microsoft 固有の拡張機能です。 それらの属性を使用すると、関数、データ、オブジェクトを DLL との間でエクスポートおよびインポートできます。
構文
__declspec( dllimport )
declarator
__declspec( dllexport )
declarator
解説
これらの属性は、DLL のクライアント (実行可能ファイルまたは別の DLL) に対する DLL のインターフェイスを明示的に定義します。 関数を dllexport
として宣言すると、少なくともエクスポートした関数の指定には、モジュール定義 (.def
) ファイルが不要になります。 dllexport
属性は __export
キーワードに置き換わるものです。
クラスを __declspec(dllexport)
とマークした場合、そのクラス階層内のクラス テンプレートの特殊化は暗黙的に __declspec(dllexport)
とマークされます。 つまり、クラス テンプレートが明示的にインスタンス化され、クラスのメンバーの定義が必要になります。
関数を dllexport
とマークすると、その関数は装飾名で公開されます。これは、"名前修飾" とも呼ばれます。 C++ 関数の場合、修飾名には、型とパラメーターの情報をエンコードする追加の文字が含まれます。 extern "C"
として宣言されている C 関数または関数は、C の名前装飾規則に従います。 C と C++ コードでの名前の装飾について詳しくは、「装飾名」をご覧ください。
修飾されていない名前をエクスポートするには、EXPORTS
セクションに非装飾名を定義したモジュール定義 (.def
) ファイルを使用してリンクできます。 詳細については、EXPORTS
を参照してください。 修飾されていない名前をエクスポートする別の方法は、ソース コードで #pragma comment(linker, "/export:alias=decorated_name")
ディレクティブを使用することです。
dllexport
または dllimport
を宣言するときは、拡張属性構文と __declspec
キーワードを使用する必要があります。
例
// Example of the dllimport and dllexport class attributes
__declspec( dllimport ) int i;
__declspec( dllexport ) void func();
または、コードをより読みやすくするために、マクロ定義を使用できます。
#define DllImport __declspec( dllimport )
#define DllExport __declspec( dllexport )
DllExport void func();
DllExport int i = 10;
DllImport int j;
DllExport int n;
詳細については、以下を参照してください:
Microsoft 固有の仕様はここまで