inheritance自COM类

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

我想用几种方法来扩展这个类,公共inheritance将比合成更实际(我希望派生的对象公开每一个父类的方法)。 派生类也应作为COM组件提供。

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

像在C ++中一样,不可能继承COM类。 有一些解决方法:

  • 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 ++构造函数中构造“继承”对象。

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

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