複数のデュアル インターフェイス
デュアル インターフェイスの利点 (vtable と遅延バインディング両方の柔軟性を備え、スクリプト言語と C++ でクラスを使用できるようになること) と、多重継承の手法を組み合わせることをお勧めします。
1 つの COM オブジェクトで複数のデュアル インターフェイスを公開することも可能ですが、これはお勧めしません。 複数のデュアル インターフェイスがある場合、1 つの IDispatch
インターフェイスのみを公開する必要があります。 これに該当することを保証するために使用できる手法には、機能の損失やコードの複雑化といった不利益が伴います。 このアプローチを検討する開発者は、長所と短所を慎重に検討する必要があります。
1 つの IDispatch インターフェイスの公開
IDispatchImpl
の複数の特殊化から派生させることで、1 つのオブジェクトで複数のデュアル インターフェイスを公開することができます。 ただし、クライアントに IDispatch
インターフェイスへのクエリを許可する場合、IDispatch
の実装で使用する基底クラスを指定するために、COM_INTERFACE_ENTRY2 マクロ (または COM_INTERFACE_ENTRY_IID)) を使用する必要があります。
COM_INTERFACE_ENTRY2(IDispatch, IMyDualInterface)
1 つの IDispatch
インターフェイスしか公開されないため、IDispatch
インターフェイスを介してのみオブジェクトにアクセスできるクライアントは、その他のインターフェイスのメソッドまたはプロパティにはアクセスできません。
複数のデュアル インターフェイスの IDispatch の 1 つの実装への結合
ATL では、複数のデュアル インターフェイスを IDispatch
の 1 つの実装に結合するためのサポートは提供されません。 ただし、インターフェイスを手動で結合するアプローチはいくつかあります。たとえば、個別の IDispatch
インターフェイスの和集合を含むテンプレート クラスの作成、QueryInterface
関数を実行するための新しいオブジェクトの作成、または入れ子のオブジェクトの typeinfo ベースの実装を使用した IDispatch
インターフェイスの使用などです。
これらのアプローチには、名前空間の競合の可能性に関する問題や、コードの複雑さと保守容易性に関する問題があります。 複数のデュアル インターフェイスの作成は推奨されません。