我正在Visual Studio2005中使用一个纯非托管项目(C++)。我在一个OCX文件中有一个来自第三方的COM类。这个类是一个控件("widget")。我一直通过一个IDispatch包装类使用它,该类是使用从类型库向导添加类生成的。
我想以几种方式扩展这个类,并且公共继承将比组合更实用(我希望派生对象公开父类所做的每个方法)。派生类还应作为COM组件可用。
我能这么做吗?如果是肯定的,我如何才能做到这一点?
发布于 2011-08-02 06:02:48
不能像在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;
}
};我真的建议你使用来创建你的COM组件。在这种情况下,在FinalConstruct()而不是C++构造函数中构造“继承的”对象。
发布于 2011-08-02 04:03:33
您可以创建一个派生自第一个接口的新接口。您的QueryInterface函数需要响应这两个GUID并提供正确的指针。一旦你这样做了,让你的具体类实现函数的超集(即所有的第二个接口,包括从第一个接口继承的所有东西)。
如果您的具体类也将从库中的具体类继承,那么您将拥有一个菱形继承模式。你可以搜索解决方案,我从这里开始:Diamond inheritance (C++)
https://stackoverflow.com/questions/6903646
复制相似问题