dllexport、dllimportdllexport, dllimport

Microsoft 固有の仕様Microsoft Specific

Dllexportdllimportストレージ クラス属性は、C および C++ 言語への Microsoft 固有の拡張機能。The dllexport and dllimport storage-class attributes are Microsoft-specific extensions to the C and C++ languages. それらの属性を使用すると、関数、データ、オブジェクトを DLL との間でエクスポートおよびインポートできます。You can use them to export and import functions, data, and objects to or from a DLL.


   __declspec( dllimport ) declarator
   __declspec( dllexport ) declarator


これらの属性は、DLL のクライアント (実行可能ファイルまたは別の DLL) に対する DLL のインターフェイスを明示的に定義します。These attributes explicitly define the DLL's interface to its client, which can be the executable file or another DLL. としての関数の宣言dllexportエクスポート関数の仕様は、少なくとも、モジュール定義 (.def) ファイルの必要があります。Declaring functions as dllexport eliminates the need for a module-definition (.def) file, at least with respect to the specification of exported functions. Dllexport置換の属性、 _ _exportキーワード。The dllexport attribute replaces the __export keyword.

クラスを declspec(dllexport) とマークした場合、そのクラス階層内のクラス テンプレートの特殊化は暗黙的に declspec(dllexport) とマークされます。If a class is marked declspec(dllexport), any specializations of class templates in the class hierarchy are implicitly marked as declspec(dllexport). つまり、クラス テンプレートが明示的にインスタンス化され、クラスのメンバーの定義が必要になります。This means that class templates are explicitly instantiated and the class's members must be defined.

dllexport関数の装飾名を使用して、関数を公開します。dllexport of a function exposes the function with its decorated name. C++ の関数の場合、この処理には名前のマングルが含まれます。For C++ functions, this includes name mangling. C 関数または extern "C" として宣言されている関数の場合、この処理には呼び出し規則に基づいたプラットフォーム固有の装飾が含まれます。For C functions or functions that are declared as extern "C", this includes platform-specific decoration that's based on the calling convention. C/C++ コードで名前の装飾については、次を参照してください。装飾名します。For information on name decoration in C/C++ code, see Decorated Names. __cdecl 呼び出し規則を使用する エクスポートされた C 関数や C++ extern "C" 関数には、名前の装飾が適用されません。No name decoration is applied to exported C functions or C++ extern "C" functions using the __cdecl calling convention.

修飾されていない名前をエクスポートするには、EXPORTS セクションに非装飾名を定義したモジュール定義 (.def) ファイルを使用してリンクできます。To export an undecorated name, you can link by using a Module Definition (.def) file that defines the undecorated name in an EXPORTS section. 詳細については、次を参照してください。エクスポートします。For more information, see EXPORTS. 非装飾の名前をエクスポートすることもできますが、使用する、#pragma comment(linker, "/export:alias=decorated_name")ディレクティブで、ソース コード。Another way to export an undecorated name is to use a #pragma comment(linker, "/export:alias=decorated_name") directive in the source code.

宣言するとdllexportまたはdllimport、使用する必要があります拡張属性構文_ _declspecキーワード。When you declare dllexport or dllimport, you must use extended attribute syntax and the __declspec keyword.


// Example of the dllimport and dllexport class attributes
__declspec( dllimport ) int i;
__declspec( dllexport ) void func();

または、コードをより読みやすくするために、マクロ定義を使用できます。Alternatively, to make your code more readable, you can use macro definitions:

#define DllImport   __declspec( dllimport )
#define DllExport   __declspec( dllexport )

DllExport void func();
DllExport int i = 10;
DllImport int j;
DllExport int n;

詳細については次を参照してください:For more information, see:

Microsoft 固有の仕様はここまでEND Microsoft Specific

関連項目See also