《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是指什麼  ???請大家指點解釋以上兩個不明之處, 謝謝 !!!

解决方案 »

  1.   

    INIT_INTERFACE_PART(CDictionary, Dictionary)我認為這一句可以不要,沒有什麼重要作用,我認為正確的應是
    INIT_INTERFACE_PART(CDictionaryObj, Dictionary)我把它改過來程序也沒有錯,原來那樣也不會錯,所以我認為沒有重要作用,可以不要
      

  2.   

    看看源代码:#define BEGIN_INTERFACE_PART(localClass, baseClass) \    //这个宏在代码中插入如下代码一看就知道声明了IUnknown的三个方法
    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
      

  3.   

    看看源代码:#define BEGIN_INTERFACE_PART(localClass, baseClass) \    //这个宏在代码中插入如下代码一看就知道声明了IUnknown的三个方法
    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
      

  4.   

    to  wangweixing2000:
    謝謝你的回答!!! 還有 theClass 是指什麼不懂!你的解釋中出現以下類的代名:localClass,baseClass,theClassbaseClass:是指接口(類)localClass:是指實現接口的嵌套類theClass: 這個是指什麼???   難道是實現組件的類???如果是指實現組件的類,那麼第五章的例子代碼就是錯的(可是如果是錯的編譯時能通過而沒錯呢???)
      

  5.   

    楼主,发觉你没有仔细看回复哦...
    其实在另外一贴: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! 
    打了一大篇,不知道我说清楚了没...
      

  6.   

    To newcore(戒烟中&迷茫的寻找第二法门):
    謝謝你的回答.
    如你所說:
    localClass:是指實現接口的嵌套類    //不全对,应该说是实现当前接口的嵌套类
    theClass: 這個是指什麼???   難道是實現組件的類???    //注意:这个才是实现接口的嵌套类!!那麼我再復述一次:
    localClass:是指實現当前接口的嵌套类
    theClass: 這個是指是實現組件的類(这个是包括那些所有實現当前接口的嵌套类的類,即是嵌套类中最外層的類)如上所述第五章的例子代碼就是錯的
    theClass應是CdictionaryObj 而不是Cdictionary (書上寫這個例子的代碼沒有錯,只是例子代碼中錯了)但是這個錯誤在編譯時卻能通過,而且用的時候也不會出錯(現在我不明白的就是這個 !!!)
    newcore(戒烟中&迷茫的寻找第二法门):
    我認為你以下說有誤(m_xDictionary與Cdictionary(那个theClass)無關,它是Xdictionary(是接口IDictionary的实现类))XDictionary是接口IDictionary的实现类,而CDictionary是m_xDictionary,这就是上面那些个宏定义展开后的意思.还有什么不清楚的。好,你会问:“为什么会有CDictionary?”(就是你说的那个theClass),
      

  7.   

    之前没有例子的源码,特地把例子的源码找来看了下,发现这里:
    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) 注释掉这个,效果是一样的.
      

  8.   

    to  newcore(戒烟中&迷茫的寻找第二法门):
    謝謝回答,你是否可繼續幫忙看看這個貼中所描述的現象呢???http://community.csdn.net/Expert/topic/4047/4047067.xml?temp=.6849939