当前位置: 首页 > 图文教程 > 开发语言 > C/C++ > 向CCmdTarget的派生类添加一个接口的实现

C/C++
ActiveX控件中多控制的设计与实现
向CCmdTarget的派生类添加一个接口的实现
多线程安全的变量模板
利用硬件信息实现共享软件的安全注册
托管C++程序开发—Win表单文档程序设计(下)
在ATL中实现窗口
基于Visual C++ 的自动化客户端的实现
ATL接口映射宏详解
托管C++程序开发—Win表单文档程序设计(中)
使用Visual C++开发SOAP客户端应用
Visual C#的SQL Server编程
VC# .Net中浏览Crystal Report
关于GC:Dotnet中Dispose的设计模式
Visual C++ 优化概述
Visual C++.NET GDI+编程基础
.NET 中的断言和跟踪
每个开发人员现在应该下载的十种必备工具
代码最优化.NET中的内存管理
在VC++下对文件属性的获取与更改
高手必看:C、C++程序的优化之路

C/C++ 中的 向CCmdTarget的派生类添加一个接口的实现


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 153 ::
收藏到网摘: n/a

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