1. 問(wèn)題提出:
《COM原理與應用》中的第五章的例子中的INIT_INTERFACE_PART(CDictionary, Dictionary) INIT_INTERFACE_PART(CDictionary, Dictionary) STDMETHOD_(BOOL, Initialize)(); STDMETHOD_(BOOL, LoadLibrary)(LPOLESTR); STDMETHOD_(BOOL, InsertWord)(LPOLESTR, LPOLESTR); STDMETHOD_(void, DeleteWord)( LPOLESTR); STDMETHOD_(BOOL, LookupWord)(LPOLESTR, LPOLESTR *); STDMETHOD_(BOOL, RestoreLibrary)(LPOLESTR); STDMETHOD_(void, FreeLibrary)(); END_INTERFACE_PART_STATIC(Dictionary) 2.候sir說(shuō)過(guò):“源碼面前了無(wú)秘密”??纯催@些宏定義的源代碼: #define BEGIN_INTERFACE_PART(localClass, baseClass) \ //這個(gè)宏在代碼中插入如下代碼一看就知道聲明了IUnknown的三個(gè)方法 class X##localClass : public baseClass \ { \ public: \ STDMETHOD_(ULONG, AddRef)(); \ STDMETHOD_(ULONG, Release)(); \ STDMETHOD(QueryInterface)(REFIID iid, LPVOID* ppvObj); \ #ifndef _AFX_NO_NESTED_DERIVATION //這里進(jìn)行了判斷,所以有時(shí)候不要也可以,最好要 #define INIT_INTERFACE_PART(theClass, localClass) \ size_t m_nOffset; \ //紀錄指針偏移量 X##localClass() \ #define INIT_INTERFACE_PART(theClass, localClass) 看了源碼,其實(shí)我們已經(jīng)可以清楚這些宏到底做了些什么。 1 首先你上面的問(wèn)題: baseClass:是指接口類(lèi)IDictionary 好,再結合一個(gè)msdn的例子: class CPrintEditObj : public CCmdTarget { public: protected: STDMETHOD_(void, EditObject)(); STDMETHOD_(void, PrintObject)(); END_INTERFACE_PART(PrintObj) }; 在這個(gè)例子中CPrintEditObj是嵌套類(lèi),實(shí)現了兩個(gè)接口IEditInterface和IPrintInterface,而: BEGIN_INTERFACE_PART(EditObj,IEditInterface) 實(shí)現了IEditInterface接口 BEGIN_INTERFACE_PART(PrintObj, IPrintInterface) 實(shí)現了IPrintInterface接口 宏源碼中的: #define INIT_INTERFACE_PART_DERIVE(theClass, localClass) \ X##localClass() \ { m_nOffset = offsetof(theClass, m_x##localClass); } \ 紀錄下了m_x EditObj和m_x PrintObj與包容類(lèi)CPrintEditObj的地址偏移。以便在通過(guò)CPrintEditObj嵌套類(lèi)查詢(xún)IEditInterface 和IPrintInterface接口的時(shí)候能返回正確的接口指針。
DictionaryObj.h 文件中有以下宏定義:
BEGIN_INTERFACE_PART(Dictionary, IDictionary)
#define INIT_INTERFACE_PART_DERIVE(theClass, localClass) \
#else
#endif
就以原例說(shuō)明:
localClass:是指實(shí)現當前接口IDictionary的嵌套類(lèi)
theClass:這個(gè)才是真正實(shí)現接口的嵌套類(lèi)!
// Interface Maps
BEGIN_INTERFACE_PART(EditObj, IEditInterface)
BEGIN_INTERFACE_PART(PrintObj, IPrintInterface)
本文來(lái)自CSDN博客,轉載請標明出處:http://blog.csdn.net/newcore/archive/2005/06/02/386714.aspx
聯(lián)系客服