继承自COM类

时间:2011-08-01 19:53:01

标签: c++ windows com visual-studio-2005

我在Visual Studio 2005中使用纯粹的非托管项目(C ++)。我有一个来自第三方的COM类,在OCX文件中。这个类是一个控件(“小部件”)。我一直在通过使用Typelib向导中的Add Class生成的IDispatch包装类来使用它。

我想以几种方式扩展这个类,公共继承比合成更实用(我希望派生对象公开父类所做的每一个方法)。派生类也应该作为COM组件提供。

我可以这样做吗?如果是积极的,我该如何做到这一点?

2 个答案:

答案 0 :(得分: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;
   }
};

修改 我真的建议您使用ATL来创建COM组件。在这种情况下,在FinalConstruct()而不是C ++构造函数中构造“继承的”对象。

答案 1 :(得分:1)

您可以创建从第一个派生的新界面。您的QueryInterface函数将需要响应两个GUID并提供正确的指针。完成后,让你的具体类实现函数的超集(即所有第二个接口,包括从第一个接口继承的所有东西。)

如果你的具体类也将从库中的具体类继承,那么你将拥有一个钻石继承模式。您可以搜索解决方案,我从这里开始:Diamond inheritance (C++)