我要投稿
  • 您当前的位置:365bet官方 -> 技术教程 -> 软件开发教程 -> C语言教程 -> 教程内容
  • [ 收藏本页教程 ]
  • 向CCmdTarget的派生类添加一个接口的实现C语言教程

    教程作者:佚名    教程来源:不详   教程栏目:C语言教程    收藏本页
        DECLARE_INTERFACE_MAP() //声明接口映射
        BEGIN_INTERFACE_PART(TestInterface, IMyTest) //声明实现接口IMyTest的嵌套类
            STDMETHOD(Test)();
        END_INTERFACE_PART(FontNotify2)

    (2)CSampleView类实现中加入以下代码:

        BEGIN_INTERFACE_MAP(CSampleView, CCmdTarget)
            INTERFACE_PART(CSampleView, IID_IMyTest, TestInterface)
        END_INTERFACE_MAP()

        STDMETHODIMP_(ULONG) CSampleView::XTestInterface::AddRef( )
        {
            METHOD_PROLOGUE_EX(CSampleView, TestInterface)
            return (ULONG)pThis->ExternalAddRef();
        }

        STDMETHODIMP_(ULONG) CSampleView::XTestInterface::Release( )
        {
            METHOD_PROLOGUE_EX(CSampleView, TestInterface)
            return (ULONG)pThis->ExternalRelease();
        }

        STDMETHODIMP CSampleView::XTestInterface::QueryInterface( REFIID iid, LPVOID FAR* ppvObj )
        {
            METHOD_PROLOGUE_EX(CSampleView, TestInterface)
            return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj) ;
        }

        STDMETHODIMP CSampleView::XTestInterface::Test()
        {
            METHOD_PROLOGUE_EX(CSampleView, TestInterface)
            // do something you like
            return S_OK ;
        }

      揭开宏的神秘面纱,看看它到底是什么东西。以下都是简化的版本。

    (1)DECLARE_INTERFACE_MAP

    struct AFX_INTERFACEMAP_ENTRY
    {
        const void* piid;
        // the interface id (IID) (NULL for aggregate)
        size_t nOffset;
        // offset of the interface vtable from m_unknown
    };

    struct AFX_INTERFACEMAP
    {
        const AFX_INTERFACEMAP* (PASCAL* pfnGetBaseMap)(); // NULL is root class
        const AFX_INTERFACEMAP_ENTRY* pEntry; // map for this class
    };

    #define DECLARE_INTERFACE_MAP() \
    private: \
        static const AFX_INTERFACEMAP_ENTRY _interfaceEntries[]; \
    protected: \
        static AFX_DATA const AFX_INTERFACEMAP interfaceMap; \
        static const AFX_INTERFACEMAP* PASCAL _GetBaseInterfaceMap(); \
        virtual const AFX_INTERFACEMAP* GetInterfaceMap() const; \

    (2)BEGIN_INTERFACE_PART/END_INTERFACE_PART

    #define BEGIN_INTERFACE_PART(localClass, baseClass) \// 定义了一个嵌套类
        class X##localClass : public baseClass \
        { \
        public: \
            STDMETHOD_(ULONG, AddRef)(); \
            STDMETHOD_(ULONG, Release)(); \
            STDMETHOD(QueryInterface)(REFIID iid, LPVOID* ppvObj); \

    #define END_INTERFACE_PART(localClass) \
        } m_x##localClass; \
        friend class X##localClass; \

    (3)BEGIN_INTERFACE_MAP/INTERFACE_PART/END_INTERFACE_MAP

    #define offsetof(s,m) (size_t)&(((s *)0)->m)

    #define BEGIN_INTERFACE_MAP(theClass, theBase) \
        const AFX_INTERFACEMAP* PASCAL theClass::_GetBaseInterfaceMap() \
            { return &theBase::interfaceMap; } \
        const AFX_INTERFACEMAP* theClass::GetInterfaceMap() const \
            { return &theClass::interfaceMap; } \
        AFX_COMDAT const AFX_DATADEF AFX_INTERFACEMAP theClass::interfaceMap = \
            { &theClass::_GetBaseInterfaceMap, &theClass::_interfaceEntries[0], }; \
        AFX_COMDAT const AFX_DATADEF AFX_INTERFACEMAP_ENTRY theClass::_interfaceEntries[] = \
        { \

    #define INTERFACE_PART(theClass, iid, localClass) \
            { &iid, offsetof(theClass, m_x##localClass) }, \

    #define END_INTERFACE_MAP() \
            { NULL, (size_t)-1 } \
        }; \

    (4)METHOD_PROLOGUE_EX

    #define METHOD_PROLOGUE_EX(theClass, localClass) \
        METHOD_PROLOGUE(theClass, localClass) \

    #define METHOD_PROLOGUE(theClass, localClass) \
        theClass* pThis = \
            ((theClass*)((BYTE*)this - offsetof(theClass, m_x##localClass))); \
        AFX_MANAGE_STATE(pThis->m_pModuleState) \
        pThis; // avoid warning from compiler \

      METHOD_PROLOGUE最大的作用就是得到pThis指针。该宏用在嵌套类的成员函数中,pThis是其父类的指针,这里也即是CSampleView的this指针。


    我要投稿   -   广告合作   -   关于本站   -   友情连接   -   网站地图   -   联系我们   -   版权声明   -   设为首页   -   加入收藏   -   网站留言
    Copyright © 2009 - 20012 www.www.ct131.com All Rights Reserved.365bet官方 版权所有