从COM类继承

Inheriting from a COM class

本文关键字:继承 COM      更新时间:2023-10-16

我在Visual Studio 2005中使用一个纯非管理项目(c++)。我有一个COM类,从第三方,在OCX文件。这个类是一个控件("widget")。我一直通过使用Typelib Wizard中的Add类生成的IDispatch包装器类来使用它。

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

我可以这样做吗?如果是肯定的,我如何做到这一点?

不可能像在c++中那样从COM类继承。不过也有一些变通办法:

  • COM总量
  • 转发

COM聚合只有在你想添加一个接口(带实现)到一个现有的COM类时才有用。不能拦截对聚合对象的调用。

Forwarding意味着如果你有一个接口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++构造函数。

您可以创建一个派生于第一个接口的新接口。QueryInterface函数需要响应这两个guid并传递适当的指针。一旦你这样做了,让你的具体类实现函数的超集(即所有的第二个接口,包括从第一个继承的一切)

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