2011-08-01 17 views
1

私はVisual Studio 2005で純粋なアンマネージプロジェクト(C++)で作業しています。 OCXファイルに第三者のCOMクラスがあります。このクラスはコントロール(「ウィジェット」)です。私はTypelib WizardからAdd Classを使って生成されたIDispatchラッパークラスを使っています。COMクラスから継承

私はいくつかの方法でこのクラスを拡張したいと思います。パブリック継承は合成よりももっと実用的でしょう(派生オブジェクトに親クラスが行うすべてのメソッドを公開したい)。派生クラスは、COMコンポーネントとしても使用できる必要があります。

これを行うことはできますか?肯定的な場合は、どうしたらいいですか?

答えて

3

C++のようにCOMクラスから継承することはできません。回避策はしかしあります:既存のCOMクラスに(実装して)インターフェイスを追加する場合は

COM凝集体の転送にのみ有効です。集約オブジェクトへの呼び出しはインターセプトできません。

転送とは、IExistingInterfaceのインターフェイスを使用している場合、IExistingInterfaceを実装する独自のクラスを実装することを意味します。あなたのクラスでは、継承するオブジェクトのインスタンスへの参照を保持します。 IExistingInterfaceの実装では、適切に "継承された"オブジェクトにコールを転送します。この方法は完全な制御を提供します。

例:(!擬似コード)

class MyClass : IExistingInterface { 
    IExistingInterface* m_pInherited; 
public: 
    MyClass() { 
     ::CoCreateInstance(CLSID_OtherImplementation, ..., ..., IID_IExistingInterface, (void**)&m_pInherited); 
    } 

    // IExistingInterface methods 
    HRESULT MethodX() { 
     // Do some pre processing 
     HRESULT hr = m_pInherited->MethodX(); 
     if(FAILED(hr)) 
      return hr; 

     // Do some post processing 
     return S_OK; 
    } 
}; 

編集: 私は本当にあなたのCOMコンポーネントを作成するために、ATLを使用することをお勧めします。その場合は、C++コンストラクタではなく、FinalConstruct()に "継承された"オブジェクトを構築してください。

1

最初のインターフェイスから派生した新しいインターフェイスを作成できます。 QueryInterface関数は、両方のGUIDに応答し、適切なポインタを提供する必要があります。これを済ませたら、具体的なクラスに関数のスーパーセット(つまり、最初のものから継承したものを含む、すべての第2インターフェース)を実装します。

コンクリートクラスがコンクリートクラスから継承する場合はライブラリには、ダイヤモンドの継承パターンがあります。あなたはその解決策を探すことができます。私はここから始めるでしょう:Diamond inheritance (C++)