将VC 6.0的工程转换为VC 2005时,一般会有一些编译错误出现,主要原因是VC 2005的编译器比在类型匹配等方面VC 6.0严格,如下列错误:
error C2440: 'static_cast' : cannot convert from 'void (__thiscall CNet_Control::* )(UINT,LONG)' to 'LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM)'
实际上这个是由于自定义的消息处理函数返回类型跟消息处理宏里面的不一致导致的。
点击这个编译错误,代码跳转到:
ON_MESSAGE(MSG_RECEIVEDATA_FROM_TOP,RecSerResult)
FuncXXX的返回类型是void,而ON_MESSAGE的宏定义为:
#define ON_MESSAGE(message, memberFxn) /
{ message, 0, 0, 0, AfxSig_lwl, /
(AFX_PMSG)(AFX_PMSGW) /
(static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM) > /
(memberFxn)) },
可以看出是LRESULT型。
所以将FuncXXX的声明和定义都改为LRESULT,然后函数内的return;都改为return 0;就可以了。
类似的还有:
ON_MESSAGE()
ON_REGISTERED_MESSAGE()
ON_THREAD_MESSAGE()
ON_REGISTERED_THREAD_MESSAGE()
其宏定义代码分别为:
// for Windows messages
#define ON_MESSAGE(message, memberFxn) /
{ message, 0, 0, 0, AfxSig_lwl, /
(AFX_PMSG)(AFX_PMSGW) /
(static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM) > /
(memberFxn)) },
// for Registered Windows messages
#define ON_REGISTERED_MESSAGE(nMessageVariable, memberFxn) /
{ 0xC000, 0, 0, 0, (UINT_PTR)(UINT*)(&nMessageVariable), /
/*implied 'AfxSig_lwl'*/ /
(AFX_PMSG)(AFX_PMSGW) /
(static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM) > /
(memberFxn)) },
// for Thread messages
#define ON_THREAD_MESSAGE(message, memberFxn) /
{ message, 0, 0, 0, AfxSig_vwl, /
(AFX_PMSG)(AFX_PMSGT) /
(static_cast< void (AFX_MSG_CALL CWinThread::*)(WPARAM, LPARAM) > /
(memberFxn)) },
// for Registered Windows messages
#define ON_REGISTERED_THREAD_MESSAGE(nMessageVariable, memberFxn) /
{ 0xC000, 0, 0, 0, (UINT_PTR)(UINT*)(&nMessageVariable), /
/*implied 'AfxSig_vwl'*/ /
(AFX_PMSG)(AFX_PMSGT) /
(static_cast< void (AFX_MSG_CALL CWinThread::*)(WPARAM, LPARAM) > /
(memberFxn)) },
所以其使用方法分别如下
The correct signature for ON_MESSAGE() is:
afx_msg LRESULT OnMyMsg(WPARAM, LPARAM)
The correct signature for ON_REGISTERED_MESSAGE is:
afx_msg LRESULT OnMyRegisteredMsg(WPARAM, LPARAM)
The correct signature for ON_THREAD_MESSAGE is:
afx_msg void OnMyThreadMsg(WPARAM, LPARAM)
The correct signature for ON_REGISTERED_THREAD_MESSAGE is:
afx_msg void OnMyRegisteredThreadMsg(WPARAM, LPARAM)