2011-08-01 6 views
1

순수 비 관리 프로젝트 (C++)로 Visual Studio 2005에서 작업하고 있습니다. OCX 파일에 제 3 자의 COM 클래스가 있습니다. 이 클래스는 컨트롤 ("위젯")입니다. 저는 Typelib Wizard에서 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 모두에 응답하고 적절한 포인터를 제공해야합니다. 이 작업을 완료 한 후에는 구체적인 클래스가 함수의 상위 집합 (즉, 첫 번째 인터페이스에서 상속 된 모든 것을 포함하여 모든 두 번째 인터페이스)을 구현하게하십시오.

구체적인 클래스가 라이브러리에 다이아몬드 상속 패턴이 있습니다. 당신은 그 해결책을 찾을 수 있습니다, 나는 여기에서 시작할 것입니다 : Diamond inheritance (C++)

관련 문제