class __declspec(novtable) CIOMessageMap
{
public:
virtual bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize) = 0;
};#define BEGIN_IO_MSG_MAP() \
public: \
bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize = 0) \
{ \
bool bRet = false; #define IO_MESSAGE_HANDLER(msg, func) \
if (msg == clientIO) \
bRet = func(pContext, dwSize); #define END_IO_MSG_MAP() \
return bRet; \
}谁能给详细的讲讲这段代码啊???这个宏定义,只要调用ProcessIOMessage,都会触发吗?
{
public:
virtual bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize) = 0;
};#define BEGIN_IO_MSG_MAP() \
public: \
bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize = 0) \
{ \
bool bRet = false; #define IO_MESSAGE_HANDLER(msg, func) \
if (msg == clientIO) \
bRet = func(pContext, dwSize); #define END_IO_MSG_MAP() \
return bRet; \
}谁能给详细的讲讲这段代码啊???这个宏定义,只要调用ProcessIOMessage,都会触发吗?
IO_MESSAGE_HANDLER(msg, func)
END_IO_MSG_MAP()
三个宏组合起来,成为一个函数定义。
基本上是这样用的:
BEGIN_IO_MSG_MAP()
IO_MESSAGE_HANDLER(WM_MSG1, OnMsg1)
IO_MESSAGE_HANDLER(WM_MSG2, OnMsg2)
IO_MESSAGE_HANDLER(WM_MSG3, OnMsg3)
....
END_IO_MSG_MAP()
BEGIN_IO_MSG_MAP()
IO_MESSAGE_HANDLER(msg, func)
END_IO_MSG_MAP()
展开后就是:public:
bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize = 0) \
{
bool bRet = false;
if (msg == clientIO) \
bRet = func(pContext, dwSize);
return bRet;
}也就是一个函数,IO_MESSAGE_HANDLER()用来添加消息响应函数来处理消息。
BEGIN_IO_MSG_MAP()和END_IO_MSG_MAP()要成对出现,因为只出现一个的话构不成完整代码,IO_MESSAGE_HANDLER(msg, func)要出现在这两个中间。例如
BEGIN_IO_MSG_MAP()
IO_MESSAGE_HANDLER(ID_MY_MSG, OnMyMsg)
END_IO_MSG_MAP()被解释成下面的代码替换这段代码
public:
bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize = 0) \
{
bool bRet = false; if (ID_MY_MSG == clientIO)
bRet = OnMyMsg(pContext, dwSize); return bRet;
}从代码结果来看,显然这些宏应该用在类的定义部分。
BEGIN_IO_MSG_MAP() 代表
public:
bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize = 0)
{
bool bRet = false; IO_MESSAGE_HANDLER(msg, func) 代表
if (msg == clientIO)
bRet = func(pContext, dwSize); END_IO_MSG_MAP() 代表
return bRet;
}三个宏就是一个函数的定义
是如何传递给宏的?
然后IOType clientIO, ClientContext* pContext, DWORD dwSize这些参数就有了
2、不是inline函数
#define BEGIN_IO_MSG_MAP() \
public: \
inline bool ProcessIOMessage(IOType clientIO, ClientContext* pContext, DWORD dwSize = 0) \
{ \
bool bRet = false;
这样才是inline函数而且你理解的还有问题,不是说参数如何传递给宏,宏只是写代码的时候的一种写法,在执行上不存在参数传递给宏这一说,你的意思应该是参数如何传递给ProcessIOMessage这个函数,那当然谁调用谁传了,系统会调用,你自己也可以调用
一般的如果能肯定这个类不是继承关系中的最低层的话可以这么用,也算是强制这个类必须被继承。
在COM中定义的对象,经常加上这个限制。