ATL COM - 如何重用接口方法的代码

时间:2012-05-28 05:43:03

标签: templates visual-c++ inheritance com atl

我有几个接口,例如IA,IB,IC等,它们共享共同的属性,例如,现场。我想知道如何重用这些接口的代码(请在COM聚合上保存答案)。

目前的实施如下:

class CA
// ATL specific...
{
    STDMETHODIMP get_Site(...) {...}
    STDMETHODIMP put_Site(...) {...}
}

class BA
// ATL specific...
{
    STDMETHODIMP get_Site(...) {...}
    STDMETHODIMP put_Site(...) {...}
}

class CC
// ATL specific...
{
    STDMETHODIMP get_Site(...) {...}
    STDMETHODIMP put_Site(...) {...}
}

我想要实现(但不能)如下。

template<typename T>
class SharedProperties
{
    STDMETHODIMP get_Site(...) {...}
    STDMETHODIMP put_Site(...) {...}
}

class CA :
// ATL specific...
SharedProperties<CA>
{
    // properties are inherited and are accessible from IC
}

class BA
// ATL specific...
SharedProperties<CB>
{
    // properties are inherited and are accessible from IB
}

class CC
// ATL specific...
SharedProperties<CC>
{
// properties are inherited and are accessible from IA
}

我在阅读(http://vcfaq.mvps.org/com/7.htm)后发现了这个想法,但该网站没有一个有效的例子,无论我尝试了多少我都无法让它工作。我一直得到“无法实例化抽象类”,因为没有实现纯虚函数get_Site和put_Site(根据第二个片段)。

修改 请注意我使用的是VS2010。下面的示例实现:

class ATL_NO_VTABLE CArticle :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CArticle, &CLSID_Article>,
    public IDispatchImpl<IArticle, &IID_IArticle, &LIBID_GeodeEdiLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
    CArticle()
    {
    }

1 个答案:

答案 0 :(得分:0)

编译器不知道方法get_Siteput_Site从接口实现方法。您需要从相应的接口继承SharedProperties类模板。这就是让SharedProperties成为模板的论据。

interface IA
{
    STDMETHOD(get_Site)() = 0;
    STDMETHOD(put_Site)() = 0;
};

template<typename T>
class Sharedproperties : T
{
public:
    STDMETHODIMP get_Site() { return E_NOTIMPL; };
    STDMETHODIMP put_Site() { return E_NOTIMPL; };
};

class CAX : public IA
{
    STDMETHOD(other)() { return S_OK; }
}

class CA: public Sharedproperties<CAX>
{
public:
    CA() {}
};

请注意,CA类不直接从接口IA继承。

编辑: VS2008类向导为简单的ATL类对象生成此继承:

class ATL_NO_VTABLE CMyObject :
    public CComObjectRootEx<CComMultiThreadModel>,
    public CComCoClass<CMyObject, &CLSID_MyObject>,
    IMyObject

其中IMyObject是IDL定义的接口。所以在ATL上下文中你只需要替换IMyObject继承:

class ATL_NO_VTABLE CMyObject :
    public CComObjectRootEx<CComMultiThreadModel>,
    public CComCoClass<CMyObject, &CLSID_MyObject>,
    public Sharedproperties<MyIntermediateClass>