C++ クラスの dllimport と dllexport を使用する
Microsoft 固有の仕様 →
dllimport または dllexport の属性の C++ クラスを宣言できます。これらの形式はクラス全体をインポートまたはエクスポートすることを意味します。クラスはこの方法で呼び出されますエクスポートできるクラスとエクスポートします。
次の例ではエクスポートできるクラスを定義しています。メンバー関数と静的データをすべてエクスポート :
#define DllExport __declspec( dllexport )
class DllExport C {
int i;
virtual int func( void ) { return 1; }
};
明示 dllimport を使用してエクスポートできるクラスのメンバーの dllexport 属性がブロックされることに注意してください。
dllexport のクラス
クラスを dllexport で宣言するとすべてのメンバー関数と静的データ メンバーがエクスポートされます。同じプログラムのすべてのこのようなメンバー定義を指定する必要があります。それ以外の場合リンカー エラーが生成されます。この規則の 1 種類の例外は明示的に定義を提供する必要はない純粋仮想関数に適用されます。ただし抽象クラスのデストラクターが基本クラスのデストラクターによって常に呼び出されるため純粋仮想デストラクターが定義を常に指定する必要があります。これらの規則が nonexportable クラスで同じであることに注意してください。
これらのクラスはクラスをエクスポートして確認するクラス型または関数のデータをエクスポートします。
dllimport のクラス
クラスの dllimport を宣言するとすべてのメンバー関数と静的データ メンバーはインポートされません。nonclass の型の dllimport と dllexport の動作とは異なり静的データ メンバーは dllimport のクラスが定義されたのと同じプログラムで定義を指定できません。
継承できるクラスとエクスポート
エクスポート可能なすべてのクラスの基本クラスはエクスポート可能である必要があります。そうでない場合はコンパイラの警告が生成されます。またクラスのすべてのメンバーがアクセス可能なエクスポート可能である必要があります。(後者は推奨されません)dllimport のクラスから継承する場合はこの規則によって dllexport のクラスと dllexport のクラスを継承する dllimport のクラス。通常DLL のクライアントからアクセスできるすべて (C++) のアクセス規則に従ってエクスポートできるインターフェイスの一部にする必要があります。これによりインライン関数で参照されるプライベート データ メンバーが含まれています。
選択的なメンバーのインポートとエクスポート
クラス内のメンバー関数に静的データに暗黙的に外部リンケージがあるためクラス全体をエクスポート dllimport または dllexport の属性で宣言できます。クラス全体をインポートまたはエクスポート dllimport または dllexport としてメンバー関数とデータの明示的な宣言は禁止されています。dllexport としてクラス定義内の静的データ メンバーを宣言すると定義は同じプログラム内に一致します (nonclass の外部リンケージで)。
同様にdllimport または dllexport の属性のメンバー関数を宣言できます。この場合同じプログラム内で定義 dllexport をどこかに指定する必要があります。
選択的なメンバーのインポートとエクスポートに関するいくつかの重要な点に注意する必要が価値があります :
選択的なメンバーのインポートとエクスポートはより制限の厳しいエクスポートされたクラス インターフェイスのバージョンを指定するために使用するのが最適です。; つまり言語よりも少ない公開キーと秘密キーの機能を公開する DLL をデザインする 1 つが他に割り当てます。またエクスポート可能なインターフェイスを最適化するためにも便利です : クライアントは定義によりプライベート データにアクセスしないことが明らかな場合はクラス全体をエクスポートする必要はありません。
クラスの 1 種類の仮想関数をエクスポート) をエクスポートするか少なくともクライアントが直接使用できるバージョンを指定します。
仮想関数を選択的なメンバーのインポートとエクスポートを使用してクラスの場合も関数はエクスポート可能なインターフェイスを定義したインラインになります (クライアントに表示されます)。
dllexport とメンバーを定義しますがクラス定義に含めるコンパイラ エラーが生成されます。クラスのヘッダーのメンバーを定義する必要があります。
dllimport または dllexport としてクラス メンバーの定義を使用できますがクラス定義で指定されているインターフェイスをオーバーライドすることはできません。
宣言したクラス定義の本体以外の場所のメンバー関数を定義すると警告 (クラス宣言で指定されているこの定義はと異なる場合が dllexport) 関数または dllimport 定義されている場合に生成されます。