向CCmdTarget的派生类添加一个接口的实现

飘落的烟灰0

飘落的烟灰0

2016-01-29 12:41

向CCmdTarget的派生类添加一个接口的实现,向CCmdTarget的派生类添加一个接口的实现
    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();
    }

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/cyuyanjiaocheng/)

    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;

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/cyuyanjiaocheng/)

(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::inter

展开更多 50%)
分享

猜你喜欢

向CCmdTarget的派生类添加一个接口的实现

C语言教程 C语言函数
向CCmdTarget的派生类添加一个接口的实现

C++派生类与基类的转换规则

编程语言 网络编程
C++派生类与基类的转换规则

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

一个用PHP实现的UBB类!

PHP
一个用PHP实现的UBB类!

如何在派生类中的隐藏基类的虚拟重载函数?

C语言教程 C语言函数
如何在派生类中的隐藏基类的虚拟重载函数?

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

一个简单的链表模版类的实现

C语言教程 C语言函数
一个简单的链表模版类的实现

一个Ajax类

Web开发
一个Ajax类

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

CSS样式表高效使用的技巧

CSS样式表高效使用的技巧

Visual SourceSafe 6.0 的问题思考

Visual SourceSafe 6.0 的问题思考
下拉加载更多内容 ↓