2009-11-13 43 views
0

ATL END_COM_MAP宏被定義如下:END_COM_MAP中的IUnknown成員函數的用途是什麼?

#define END_COM_MAP() \ 
    __if_exists(_GetAttrEntries) {{NULL, (DWORD_PTR)_GetAttrEntries, _ChainAttr }, }\ 
    {NULL, 0, 0}}; return _entries;} \ 
    virtual ULONG STDMETHODCALLTYPE AddRef(void) throw() = 0; \ 
    virtual ULONG STDMETHODCALLTYPE Release(void) throw() = 0; \ 
    STDMETHOD(QueryInterface)(REFIID, void**) throw() = 0; 

它旨在被從COM接口繼承的類定義中使用,例如:

class ATL_NO_VTABLE CMyClass : 
    public CComCoClass<CMyClass, &MyClassGuid>, 
    public CComObjectRoot, 
    public IMyComInterface 
{ 
public: 
    BEGIN_COM_MAP(CMyClass) 
     COM_INTERFACE_ENTRY(IMyComInterface) 
    END_COM_MAP() 
}; 

這意味着的QueryInterface(),的AddRef ()和Release()在這個類中聲明爲純虛擬。由於我沒有定義它們的實現,所以這個類應該是不可取的。然而ATL成功實例化了它。

它是如何工作的,爲什麼這些IUnknown成員函數在這裏重新聲明?

回答

5

自從我使用ATL但是IIRC以來,已經有一段時間,實例化的結果不是CMyClass,而是CComObject<CMyClass>

CComObject implements IUnknown並且從其模板參數繼承。

編輯:MSDN上的「Fundamentals of ATL COM Objects」頁面很好地說明了發生了什麼。

+0

還有一些其他的CComObjects,正如在引用的文章中提到的。每個變體定製IUnknown行爲,QueryInterface或生命週期管理(AddRef/Release)。 – 2009-11-14 14:56:44

相關問題