从COM类继承
Inheriting from a COM class
我在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++)
相关文章:
- 继承函数的重载解析
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- c++ com 如何继承 IUIAutomationPropertyChangedEventHandler 接口
- 如何使COM主机进程避免从父进程继承环境变量
- 代理dll:方法覆盖/方法转发(COM实现继承)
- 从COM类继承