C++ クラスでの dllimport と dllexport の使用Using dllimport and dllexport in C++ Classes

Microsoft 固有の仕様Microsoft Specific

または属性を使用して C++ クラスを宣言でき dllimport dllexport ます。You can declare C++ classes with the dllimport or dllexport attribute. これらの形式は、クラス全体がインポートまたはエクスポートされることを暗黙的に指定します。These forms imply that the entire class is imported or exported. この方法でエクスポートされたクラスは、エクスポート可能なクラスと呼ばれます。Classes exported this way are called exportable classes.

次の例では、エクスポート可能なクラスを定義しています。The following example defines an exportable class. そのメンバー関数と静的データはすべてエクスポートされます。All its member functions and static data are exported:

#define DllExport   __declspec( dllexport )

class DllExport C {
   int i;
   virtual int func( void ) { return 1; }
};

エクスポート可能な dllimport クラスのメンバーで属性と属性を明示的に使用すること dllexport は禁止されています。Note that explicit use of the dllimport and dllexport attributes on members of an exportable class is prohibited.

dllexport クラスdllexport Classes

クラスを宣言すると dllexport 、そのすべてのメンバー関数と静的データメンバーがエクスポートされます。When you declare a class dllexport, all its member functions and static data members are exported. このようなすべてのメンバーは同じプログラム内で定義する必要があります。You must provide the definitions of all such members in the same program. 定義しない場合は、リンカー エラーが生成されます。Otherwise, a linker error is generated. この規則の例外は純粋仮想関数です。純粋仮想関数にはこのような明示的な定義は不要です。The one exception to this rule applies to pure virtual functions, for which you need not provide explicit definitions. ただし、抽象クラスのデストラクターは基底クラスのデストラクターによって常に呼び出されるため、純粋仮想デストラクターには常に明示的な定義が必要です。However, because a destructor for an abstract class is always called by the destructor for the base class, pure virtual destructors must always provide a definition. これらの規則はエクスポート不可クラスに対しても同じであることに注意してください。Note that these rules are the same for nonexportable classes.

クラス型のデータまたはクラスを返す関数をエクスポートする場合、必ずそのクラスもエクスポートしてください。If you export data of class type or functions that return classes, be sure to export the class.

dllimport クラスdllimport Classes

クラスを宣言すると dllimport 、そのすべてのメンバー関数と静的データメンバーがインポートされます。When you declare a class dllimport, all its member functions and static data members are imported. クラス以外の型のとの動作とは異なり dllimport dllexport 、静的データメンバーは、 dllimport クラスが定義されている同じプログラム内で定義を指定することはできません。Unlike the behavior of dllimport and dllexport on nonclass types, static data members cannot specify a definition in the same program in which a dllimport class is defined.

継承とエクスポート可能なクラスInheritance and Exportable Classes

エクスポート可能なクラスのすべての基底クラスはエクスポート可能である必要があります。All base classes of an exportable class must be exportable. そうでない場合、コンパイラ警告が生成されます。If not, a compiler warning is generated. また、クラスでもあるアクセス可能なメンバーはすべてエクスポート可能である必要があります。Moreover, all accessible members that are also classes must be exportable. この規則により、クラスはクラスを継承し、クラスはクラスから継承でき dllexport dllimport dllimport dllexport ます (後者は推奨されません)。This rule permits a dllexport class to inherit from a dllimport class, and a dllimport class to inherit from a dllexport class (though the latter is not recommended). 一般的に、DLL のクライアントからアクセス可能な (C++ のアクセス規則に従って) すべてのものは、エクスポート可能なインターフェイスの一部である必要があります。As a rule, everything that is accessible to the DLL's client (according to C++ access rules) should be part of the exportable interface. たとえば、インライン関数で参照されるプライベート データ メンバーなどです。This includes private data members referenced in inline functions.

選択的メンバーのインポート/エクスポートSelective Member Import/Export

クラス内のメンバー関数と静的データは暗黙的に外部リンケージを持つため、 dllimport dllexport クラス全体がエクスポートされない限り、属性または属性を使用して宣言できます。Because member functions and static data within a class implicitly have external linkage, you can declare them with the dllimport or dllexport attribute, unless the entire class is exported. クラス全体がインポートまたはエクスポートされた場合、メンバー関数とデータをまたはとして明示的に宣言すること dllimport dllexport は禁止されています。If the entire class is imported or exported, the explicit declaration of member functions and data as dllimport or dllexport is prohibited. クラス定義内の静的データメンバーをとして宣言する場合は dllexport 、(非クラス外部リンケージと同様に) 同じプログラム内の任意の場所で定義を行う必要があります。If you declare a static data member within a class definition as dllexport, a definition must occur somewhere within the same program (as with nonclass external linkage).

同様に、属性または属性を使用してメンバー関数を宣言でき dllimport dllexport ます。Similarly, you can declare member functions with the dllimport or dllexport attributes. この場合は、 dllexport 同じプログラム内のどこかに定義を指定する必要があります。In this case, you must provide a dllexport definition somewhere within the same program.

選択的なメンバーのインポート/エクスポートには、次のいくつかの重要な点に注意してください。It is worthwhile to note several important points regarding selective member import and export:

  • 選択的なメンバーのインポート/エクスポートは、より制限が厳しい、エクスポートされたクラス インターフェイスのバージョン (つまり、言語で許容されるよりも少ないパブリック機能およびプライベート機能を公開する DLL を設計できるバージョン) を提供する場合に最適です。Selective member import/export is best used for providing a version of the exported class interface that is more restrictive; that is, one for which you can design a DLL that exposes fewer public and private features than the language would otherwise allow. また、エクスポート可能なインターフェイスを最適化するためにも便利です。クライアントがプライベート データにアクセスできない場合は、もちろん、クラス全体をエクスポートする必要はありません。It is also useful for fine-tuning the exportable interface: when you know that the client, by definition, is unable to access some private data, you need not export the entire class.

  • クラス内の 1 つの仮想関数をエクスポートする場合、それらの関数のすべてをエクスポートするか、少なくともクライアントが直接使用できるバージョンを提供する必要があります。If you export one virtual function in a class, you must export all of them, or at least provide versions that the client can use directly.

  • 仮想関数で使用する選択的なメンバーのインポート/エクスポートを行うクラスがある場合、それらの関数はエクスポート可能なインターフェイスまたは定義済みインライン内 (クライアントから参照可能) にある必要があります。If you have a class in which you are using selective member import/export with virtual functions, the functions must be in the exportable interface or defined inline (visible to the client).

  • メンバーをとして定義して dllexport も、クラス定義に含めない場合は、コンパイラエラーが生成されます。If you define a member as dllexport but do not include it in the class definition, a compiler error is generated. クラスのヘッダーでメンバーを定義する必要があります。You must define the member in the class header.

  • またはクラスメンバーの定義は dllimport 許可されてい dllexport ますが、クラス定義で指定されたインターフェイスをオーバーライドすることはできません。Although the definition of class members as dllimport or dllexport is permitted, you cannot override the interface specified in the class definition.

  • 宣言したクラス定義の本体以外の場所でメンバー関数を定義した場合、関数がまたはとして定義されている場合 dllexport dllimport (この定義がクラス宣言で指定されているものと異なる場合)、警告が生成されます。If you define a member function in a place other than the body of the class definition in which you declared it, a warning is generated if the function is defined as dllexport or dllimport (if this definition differs from that specified in the class declaration).

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

関連項目See also

dllexport、dllimportdllexport, dllimport