C++ 从COM类继承
我在VisualStudio2005中处理一个纯非托管项目(C++)。我在OCX文件中有一个来自第三方的COM类。这个类是一个控件(“小部件”)。我一直在通过IDispatch包装类使用它,该包装类是使用AddClass fromTypeLib向导生成的 我想以几种方式扩展这个类,公共继承将比合成更加实用(我希望派生对象公开父类所做的每一个方法)。派生类也应作为COM组件提供C++ 从COM类继承,c++,windows,com,visual-studio-2005,C++,Windows,Com,Visual Studio 2005,我在VisualStudio2005中处理一个纯非托管项目(C++)。我在OCX文件中有一个来自第三方的COM类。这个类是一个控件(“小部件”)。我一直在通过IDispatch包装类使用它,该包装类是使用AddClass fromTypeLib向导生成的 我想以几种方式扩展这个类,公共继承将比合成更加实用(我希望派生对象公开父类所做的每一个方法)。派生类也应作为COM组件提供 我能做这个吗?如果是肯定的,我如何才能做到这一点?您可以创建一个从第一个接口派生的新接口。QueryInterface函
我能做这个吗?如果是肯定的,我如何才能做到这一点?您可以创建一个从第一个接口派生的新接口。QueryInterface函数将需要响应这两个GUI并提供正确的指针。完成后,让您的具体类实现函数的超集(即所有第二个接口,包括从第一个接口继承的所有内容)
如果您的具体类也将从库中的具体类继承,那么您将拥有菱形继承模式。您可以搜索解决方案,我从这里开始:您可以创建一个从第一个接口派生的新接口。QueryInterface函数将需要响应这两个GUI并提供正确的指针。完成后,让您的具体类实现函数的超集(即所有第二个接口,包括从第一个接口继承的所有内容)
如果您的具体类也将从库中的具体类继承,那么您将拥有菱形继承模式。您可以搜索解决方案,我将从这里开始:不可能像C++一样继承COM类。不过,还有一些变通办法:
- 转发
IExistingInterface
,那么您就实现了自己的类,该类实现了IExistingInterface
。在类中,保留对要“继承”的对象实例的引用。在IExistingInterface
的实现中,您可以将适当的调用转发给“继承的”对象。此方法提供了完全控制
示例:(伪代码!)
编辑:
我真的建议您使用ATL来创建COM组件。在这种情况下,在
- 转发
IExistingInterface
,那么您就实现了自己的类,该类实现了IExistingInterface
。在类中,保留对要“继承”的对象实例的引用。在IExistingInterface
的实现中,您可以将适当的调用转发给“继承的”对象。此方法提供了完全控制
示例:(伪代码!)
编辑:
我真的建议您使用ATL来创建COM组件。在这种情况下,在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;
}
};