《COM原理与应用》中的第五章的例子中的INIT_INTERFACE_PART(CDictionary, Dictionary)不解?請大家幫忙解釋,謝謝!!!DictionaryObj.h 文件中有以下宏定義: BEGIN_INTERFACE_PART(Dictionary, IDictionary)
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)
// ISpellCheck
BEGIN_INTERFACE_PART(SpellCheck, ISpellCheck)
INIT_INTERFACE_PART(CDictionary, SpellCheck)
STDMETHOD_(BOOL, CheckWord)(LPOLESTR, LPOLESTR *);
END_INTERFACE_PART_STATIC(SpellCheck)BEGIN_INTERFACE_PART(Dictionary, IDictionary)
我的理解為:
Dictionary是指實現接口的類名,在實際實現中即嵌套類XDictionary
Idictionary 是指Dictionary(嵌套類XDictionary)所實現的接口INIT_INTERFACE_PART(CDictionary, Dictionary)
這一句我不明白其作用 ???
這一句中的CDictionary是指什麼 ???請大家指點解釋以上兩個不明之處, 謝謝 !!!
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)
// ISpellCheck
BEGIN_INTERFACE_PART(SpellCheck, ISpellCheck)
INIT_INTERFACE_PART(CDictionary, SpellCheck)
STDMETHOD_(BOOL, CheckWord)(LPOLESTR, LPOLESTR *);
END_INTERFACE_PART_STATIC(SpellCheck)BEGIN_INTERFACE_PART(Dictionary, IDictionary)
我的理解為:
Dictionary是指實現接口的類名,在實際實現中即嵌套類XDictionary
Idictionary 是指Dictionary(嵌套類XDictionary)所實現的接口INIT_INTERFACE_PART(CDictionary, Dictionary)
這一句我不明白其作用 ???
這一句中的CDictionary是指什麼 ???請大家指點解釋以上兩個不明之處, 謝謝 !!!
INIT_INTERFACE_PART(CDictionaryObj, Dictionary)我把它改過來程序也沒有錯,原來那樣也不會錯,所以我認為沒有重要作用,可以不要
class X##localClass : public baseClass \
{ \
public: \
STDMETHOD_(ULONG, AddRef)(); \
STDMETHOD_(ULONG, Release)(); \
STDMETHOD(QueryInterface)(REFIID iid, LPVOID* ppvObj); \
#ifndef _AFX_NO_NESTED_DERIVATION //这里进行了判断,所以有时候不要也可以,最好要
#define INIT_INTERFACE_PART(theClass, localClass) \
size_t m_nOffset; \ //纪录指针偏移量
INIT_INTERFACE_PART_DERIVE(theClass, localClass) \#define INIT_INTERFACE_PART_DERIVE(theClass, localClass) \
X##localClass() \
{ m_nOffset = offsetof(theClass, m_x##localClass); } \#else
#define INIT_INTERFACE_PART(theClass, localClass)
#define INIT_INTERFACE_PART_DERIVE(theClass, localClass)#endif
class X##localClass : public baseClass \
{ \
public: \
STDMETHOD_(ULONG, AddRef)(); \
STDMETHOD_(ULONG, Release)(); \
STDMETHOD(QueryInterface)(REFIID iid, LPVOID* ppvObj); \
#ifndef _AFX_NO_NESTED_DERIVATION //这里进行了判断,所以有时候不要也可以,最好要
#define INIT_INTERFACE_PART(theClass, localClass) \
size_t m_nOffset; \ //纪录指针偏移量
INIT_INTERFACE_PART_DERIVE(theClass, localClass) \#define INIT_INTERFACE_PART_DERIVE(theClass, localClass) \
X##localClass() \
{ m_nOffset = offsetof(theClass, m_x##localClass); } \#else
#define INIT_INTERFACE_PART(theClass, localClass)
#define INIT_INTERFACE_PART_DERIVE(theClass, localClass)#endif
謝謝你的回答!!! 還有 theClass 是指什麼不懂!你的解釋中出現以下類的代名:localClass,baseClass,theClassbaseClass:是指接口(類)localClass:是指實現接口的嵌套類theClass: 這個是指什麼??? 難道是實現組件的類???如果是指實現組件的類,那麼第五章的例子代碼就是錯的(可是如果是錯的編譯時能通過而沒錯呢???)
其实在另外一贴:http://community.csdn.net/Expert/topic/4047/4047067.xml?temp=.7198603
和这个帖子里的回复加起来应该说是讲的很清楚了。我来给你总结一下吧:1 首先你上面的问题:baseClass:是指接口(類) //对localClass:是指實現接口的嵌套類 //不全对,应该说是实现当前接口的嵌套类theClass: 這個是指什麼??? 難道是實現組件的類??? //注意:这个才是实现接口的嵌套类!!2 宏的源码不是都给你了吗?
就这个例子:
XDictionary是接口IDictionary的实现类,而CDictionary是m_xDictionary,这就是上面那些个宏定义展开后的意思.还有什么不清楚的。好,你会问:“为什么会有CDictionary?”(就是你说的那个theClass),这在我给你的另外一个回复里有答案:
看这个:
class CPrintEditObj : public CCmdTarget
{
public:
// member data and member functions for CPrintEditObj go here// Interface Maps
protected:
DECLARE_INTERFACE_MAP() BEGIN_INTERFACE_PART(EditObj, IEditInterface)
STDMETHOD_(void, EditObject)();
END_INTERFACE_PART(EditObj) BEGIN_INTERFACE_PART(PrintObj, IPrintInterface)
STDMETHOD_(void, PrintObject)();
END_INTERFACE_PART(PrintObj)
};
看看这个例子,仔细想想。这里实现多个接口了,that's why!
打了一大篇,不知道我说清楚了没...
謝謝你的回答.
如你所說:
localClass:是指實現接口的嵌套類 //不全对,应该说是实现当前接口的嵌套类
theClass: 這個是指什麼??? 難道是實現組件的類??? //注意:这个才是实现接口的嵌套类!!那麼我再復述一次:
localClass:是指實現当前接口的嵌套类
theClass: 這個是指是實現組件的類(这个是包括那些所有實現当前接口的嵌套类的類,即是嵌套类中最外層的類)如上所述第五章的例子代碼就是錯的
theClass應是CdictionaryObj 而不是Cdictionary (書上寫這個例子的代碼沒有錯,只是例子代碼中錯了)但是這個錯誤在編譯時卻能通過,而且用的時候也不會出錯(現在我不明白的就是這個 !!!)
newcore(戒烟中&迷茫的寻找第二法门):
我認為你以下說有誤(m_xDictionary與Cdictionary(那个theClass)無關,它是Xdictionary(是接口IDictionary的实现类))XDictionary是接口IDictionary的实现类,而CDictionary是m_xDictionary,这就是上面那些个宏定义展开后的意思.还有什么不清楚的。好,你会问:“为什么会有CDictionary?”(就是你说的那个theClass),
INIT_INTERFACE_PART(CDictionary, Dictionary)似乎确是有点问题.照理说应该是这样:
INIT_INTERFACE_PART(CDictionaryObj, Dictionary)
其他地方到没有发觉有什么问题...至于编译能通过,因为这里:
#ifndef _AFX_NO_NESTED_DERIVATION //这里进行了判断,所以有时候不要也可以,最好要
#define INIT_INTERFACE_PART(theClass, localClass) \
size_t m_nOffset; \ //纪录指针偏移量
INIT_INTERFACE_PART_DERIVE(theClass, localClass) \#define INIT_INTERFACE_PART_DERIVE(theClass, localClass) \
X##localClass() \
{ m_nOffset = offsetof(theClass, m_x##localClass); } \
而在AFXVER.H中有:
#define _AFX_NO_NESTED_DERIVATION 我试了试,其实
// INIT_INTERFACE_PART(CDictionary, Dictionary) 注释掉这个,效果是一样的.
謝謝回答,你是否可繼續幫忙看看這個貼中所描述的現象呢???http://community.csdn.net/Expert/topic/4047/4047067.xml?temp=.6849939