MFC实现COM时用到的一些宏定义

 一、用#define BEGIN_INTERFACE_PART(localClass, baseClass)宏来声明内嵌类class X##localClass : public baseClass
 并声明类函数AddRef、Release、QueryInterface

#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 INIT_INTERFACE_PART(theClass, localClass)宏来为类添加公有变量size_t m_nOffset,并实现累的构造函数
 在类的构造函数中为m_nOffset赋值。

#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); } \


三、用#define STDMETHOD_(type,method) type (STDMETHODCALLTYPE * method)宏来为类添加公有函数

#define STDMETHOD_(type,method) type (STDMETHODCALLTYPE * method)

#define STDMETHODCALLTYPE       __export __stdcall


四、用#define END_INTERFACE_PART(localClass)宏来结束内嵌类的定义,并为外部类定义变量m_x##localClass,同时声明
 X##localClass类为外部类的友元类。

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

 


五、用#define DECLARE_INTERFACE_MAP()宏为外部类添加私有静态接口数组变量,同时添加静态保护变量interfaceMap和
 成员函数GetInterfaceMap

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

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
{
#ifdef _AFXDLL
const AFX_INTERFACEMAP* (PASCAL* pfnGetBaseMap)(); // NULL is root class
#else
const AFX_INTERFACEMAP* pBaseMap;
#endif
const AFX_INTERFACEMAP_ENTRY* pEntry; // map for this class
};

 


六、用#define DECLARE_OLECREATE(class_name)宏为COM类实现类工厂并添加GUID静态共有变量
 
#define DECLARE_OLECREATE(class_name) \
public: \
static AFX_DATA COleObjectFactory factory; \
static AFX_DATA const GUID guid; \

 


七、用#define BEGIN_INTERFACE_MAP(theClass, theBase)宏为实现GetInterfaceMap()函数,并为外部类的静态保护变量
 interfaceMap赋值,同时结合#define INTERFACE_PART(theClass, iid, localClass)为静态接口数组_interfaceEntries[]
 数组赋值。

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

 


八、用#define INTERFACE_PART(theClass, iid, localClass) 宏结合#define BEGIN_INTERFACE_MAP(theClass, theBase)为外部
 类的静态接口数组_interfaceEntries[]赋值。

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

 


九、用#define END_INTERFACE_MAP()宏结束外部类的静态接口数组_interfaceEntries[]赋值,并未数组最后一个值的iid为空,
 偏移值。赋值为-1。
 
#define END_INTERFACE_MAP() \
{ NULL, (size_t)-1 } \
}; \

十、用#define 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 \

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值