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

2016-01-29 12:41 62 1 收藏

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

【 tulaoshi.com - 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 ;
    }

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

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

(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
};

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

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

来源:http://www.tulaoshi.com/n/20160129/1487159.html

延伸阅读
一个在RichEdit中添加表情图象的类 作者:中原工学院 刘翔 下载源代码 说明 本文根据VC知识库《在线杂志》的第30期的一篇文章:《类似 MSN 信息发送框的制作》,介绍了一个可以在RichEdit中添加表情图象的类CFaceEdit。 以下是使用这个类的程序截图: 图一 CFaceEdit类的使用...
标签: Web开发
程序代码: script type="text/javascript" function Ajax(sUrl,sRecvTyp,sQueryString,oResultFunc) { this.Url = sUrl; this.QueryString = sQueryString; this.XmlHttp = this.createXMLHttpRequest(); if (this.XmlHttp == null) { alert("erro"); return; } var objxml = this.XmlHttp; objxml.onreadystatechange = function (){Ajax.han...
一个打印报表的简单的类 作者:李静南 下载源代码 一、前两天为公司改程序,其中有一部分是要打印出报表。原来的程序是调用VB写的一个程序。那个程序用VBA方式实现的,在一个空的WORD表格模板里填入数据,让WORD去打印,效果还可以,就是速度很慢。但是这次,上次写代码的人已经不在...
标签: Web开发
我现在还不会写持久层,就用这种方法加上存储过程用,我感觉还比较爽,希望大家多多指教 public class clsdb {      public clsdb()  {   //   // TODO: 在此处添加构造函数逻辑   //  } //数据库连接     public static SqlCo...
标签: Web开发
非常不错的一个javascript 类 代码如下: /*    *  Author:aoao  *    Homepage:http://www.loaoao.com  *  Email:loaoao@gmail.com / QQ:2222342  *  Copyright (c) 2006 aoao  *  Licensed under ...

经验教程

509

收藏

34
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部