VC 6.0工程转VC 2005工程的编译错误----消息处理宏

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)

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值