Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从COM类继承_C++_Windows_Com_Visual Studio 2005 - Fatal编程技术网

C++ 从COM类继承

C++ 从COM类继承,c++,windows,com,visual-studio-2005,C++,Windows,Com,Visual Studio 2005,我在VisualStudio2005中处理一个纯非托管项目(C++)。我在OCX文件中有一个来自第三方的COM类。这个类是一个控件(“小部件”)。我一直在通过IDispatch包装类使用它,该包装类是使用AddClass fromTypeLib向导生成的 我想以几种方式扩展这个类,公共继承将比合成更加实用(我希望派生对象公开父类所做的每一个方法)。派生类也应作为COM组件提供 我能做这个吗?如果是肯定的,我如何才能做到这一点?您可以创建一个从第一个接口派生的新接口。QueryInterface函

我在VisualStudio2005中处理一个纯非托管项目(C++)。我在OCX文件中有一个来自第三方的COM类。这个类是一个控件(“小部件”)。我一直在通过IDispatch包装类使用它,该包装类是使用AddClass fromTypeLib向导生成的

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


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

您可以创建一个从第一个接口派生的新接口。QueryInterface函数将需要响应这两个GUI并提供正确的指针。完成后,让您的具体类实现函数的超集(即所有第二个接口,包括从第一个接口继承的所有内容)


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

您可以创建一个从第一个接口派生的新接口。QueryInterface函数将需要响应这两个GUI并提供正确的指针。完成后,让您的具体类实现函数的超集(即所有第二个接口,包括从第一个接口继承的所有内容)


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

不可能像C++一样继承COM类。不过,还有一些变通办法:

  • 转发
COM聚合仅在希望向现有COM类添加接口(带实现)时有用。无法拦截对聚合对象的调用

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

示例:(伪代码!)

编辑:
我真的建议您使用ATL来创建COM组件。在这种情况下,在FielGuangthTe]()/Cuth>中构造“继承”对象,而不是C++构造函数。

< P>不能从C++类继承,如C++中所能继承的那样。不过,还有一些变通办法:

  • 转发
COM聚合仅在希望向现有COM类添加接口(带实现)时有用。无法拦截对聚合对象的调用

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

示例:(伪代码!)

编辑: 我真的建议您使用ATL来创建COM组件。在这种情况下,在FielGuangthTe]()/Cuth>中构造“继承”对象,而不是C++构造函数。
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;
   }
};