COM - 避免重复实现IUnknown

时间:2014-12-10 16:53:13

标签: c++ windows internet-explorer inheritance com

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

class Child1 : public Unknown<IObjectWithSite>

class Child2 : public Unknown<IClassFactory>

template <class T>
class Unknown : public T

我已经这样做了以避免钻石问题。

Child1 ---> Unknown ---> IObjectWithSite

Child2 ---> Unknown ---> IClassFactory

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

我似乎无法让它发挥作用。我在这里错过了什么吗?我走错了路吗?

编辑:这是以下代码

Unknown.h

#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

#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:

#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...

2 个答案:

答案 0 :(得分:0)

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

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

您在类声明中实例化父模板,不允许这样做。

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

template <class T>
STDMETHODIMP Child2<T>::SetSite(IUnknown*) {
     // Implementation...
}

对于你的问题,你不需要申报2个孩子班,你可以简单地使用:

Unknown<IObjectWithSite> child1;
Unknown<IClassFactory> child2;

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

答案 1 :(得分:0)

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