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成員函數在這裏重新聲明?
還有一些其他的CComObjects,正如在引用的文章中提到的。每個變體定製IUnknown行爲,QueryInterface或生命週期管理(AddRef/Release)。 – 2009-11-14 14:56:44