我在Visual Studio 2005中使用纯粹的非托管项目(C ++)。我有一个来自第三方的COM类,在OCX文件中。这个类是一个控件(“小部件”)。我一直在通过使用Typelib向导中的Add Class生成的IDispatch包装类来使用它。
我想以几种方式扩展这个类,公共继承比合成更实用(我希望派生对象公开父类所做的每一个方法)。派生类也应该作为COM组件提供。
我可以这样做吗?如果是积极的,我该如何做到这一点?
答案 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++)