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; }
};

その明示的な使用に注意してください、 dllimportdllexportエクスポート可能なクラスのメンバーの属性が禁止されています。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. 動作とは異なりdllimportdllexport 、クラス型に対する静的データ メンバーを同じプログラム内で定義を指定できない、 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