首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >COM -避免重复实现IUnknown

COM -避免重复实现IUnknown
EN

Stack Overflow用户
提问于 2014-12-11 00:53:13
回答 2查看 831关注 0票数 1

我正在尝试为Internet Explorer实现一个基本的浏览器帮助对象。我有两个类,一个必须实现IClassFactory,另一个必须实现IObjectWithSite。这两个接口都继承自IUnknown。为了避免重复实现IUnknown,我创建了一个未知的基类,这样对于给定的子类,我只需要实现它的直接父接口。下面是我的类声明:

代码语言:javascript
复制
class Child1 : public Unknown<IObjectWithSite>

class Child2 : public Unknown<IClassFactory>

template <class T>
class Unknown : public T

我这样做是为了避免钻石问题。

代码语言:javascript
复制
Child1 ---> Unknown ---> IObjectWithSite

Child2 ---> Unknown ---> IClassFactory

在Unknown中,我实现了它将从T继承的IUnknown方法。

我好像不能让它起作用。我是不是漏掉了什么?我是不是走错路了?

编辑:下面是代码

Unknown.h

代码语言:javascript
复制
#pragma once

#include <OCIdl.h>
#include <Unknwn.h>

template <class T>
class Unknown : public T
{

protected:

    // Reference count to this COM class
    ULONG m_comRef;

public:

    // IUnknown methods
    STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject)
    {
        // Implementation...
    }

    STDMETHODIMP_(ULONG) AddRef()
    {
        // Implementation...
    }

    STDMETHODIMP_(ULONG) Release()
    {
        // Implementation...
    }

};

Child1.h

代码语言:javascript
复制
#pragma once

#include "Unknown.h"

template <class T>
class Child1 : public Unknown<T>
{

public:

    STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject);

};

STDMETHODIMP Child1<IClassFactory>::QueryInterface(REFIID riid, void** ppvObject) {
    // implementation...
}

etc...

Child2:

代码语言:javascript
复制
#pragma once

#include "Unknown.h"

template <class T>
class Child2 : public Unknown<T>
{

public:

    STDMETHODIMP SetSite(IUnknown*);

    STDMETHODIMP GetSite(REFIID, void**);

    STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject);

};

STDMETHODIMP Child2<IObjectWithSite>::SetSite(IUnknown*) {
     // Implementation...
}

etc...
EN

回答 2

Stack Overflow用户

发布于 2014-12-11 01:53:39

您应该将子类声明更改为:

代码语言:javascript
复制
template <class T>
class Child1 : public Unknown<T>

您正在类声明中实例化父模板,这是不允许的。

在函数实现中,您仍然需要使用T:

代码语言:javascript
复制
template <class T>
STDMETHODIMP Child2<T>::SetSite(IUnknown*) {
     // Implementation...
}

对于你的问题,你不需要声明2个子类,你可以简单地使用:

代码语言:javascript
复制
Unknown<IObjectWithSite> child1;
Unknown<IClassFactory> child2;

在实例化模板时,编译器会创建一个新类型,因此Unknown<IObjectWithSite>Unknown<IClassFactory>是实现了IUnknown的不同类型。

票数 0
EN

Stack Overflow用户

发布于 2014-12-11 03:21:20

是的,你做错了。使用ATL。把时间花在编写功能上,而不是重新实现IUnknown和IClassFactory。

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

https://stackoverflow.com/questions/27406552

复制
相关文章

相似问题

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