簡體   English   中英

ATL COM-如何為接口方法重用代碼

[英]ATL COM - How To Reuse Code for Interface Method

我有幾個接口,例如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()
    {
    }

編譯器不知道方法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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM