并声明类函数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 \