首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从COM类继承

从COM类继承
EN

Stack Overflow用户
提问于 2011-08-02 03:53:01
回答 2查看 537关注 0票数 1

我正在Visual Studio2005中使用一个纯非托管项目(C++)。我在一个OCX文件中有一个来自第三方的COM类。这个类是一个控件("widget")。我一直通过一个IDispatch包装类使用它,该类是使用从类型库向导添加类生成的。

我想以几种方式扩展这个类,并且公共继承将比组合更实用(我希望派生对象公开父类所做的每个方法)。派生类还应作为COM组件可用。

我能这么做吗?如果是肯定的,我如何才能做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-02 06:02:48

不能像在C++中那样从COM类继承。不过,也有一些变通方法:

  • COM Aggregates
  • Forwarding

仅当要向现有COM类添加接口(具有实现)时,COM聚合才有用。您不能拦截对聚合对象的调用。

转发意味着如果你有一个接口IExistingInterface,你就实现了你自己的实现IExistingInterface的类。在你的类中,你保留一个对你想要“继承”的对象实例的引用。在您的IExistingInterface实现中,您将适当地将调用转发到“继承的”对象。此方法使您可以完全控制。

示例:(伪代码!)

代码语言:javascript
复制
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++构造函数中构造“继承的”对象。

票数 3
EN

Stack Overflow用户

发布于 2011-08-02 04:03:33

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

如果您的具体类也将从库中的具体类继承,那么您将拥有一个菱形继承模式。你可以搜索解决方案,我从这里开始:Diamond inheritance (C++)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6903646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档