这个我最清楚,我也是近几个月,从VC6转VC.net的,在VC.net中对于函数的类型非常严格,有些在VC6通过的函数,在.net中就要经过很大的变化你好好检查一下返回类型,就一切OK了

解决方案 »

  1.   

    你可以参考一下Q99848
    http://support.microsoft.com/support/kb/articles/Q99/8/48.ASP
    --------------------
    Here's an example of how an application could use ON_MESSAGE:   // inside the class declaration
      afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);  ...  #define WM_MYMESSAGE (WM_USER + 100)  BEGIN_MESSAGE_MAP(CMyWnd, CMyParentWndClass)
         ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)
      END_MESSAGE_MAP()  LRESULT CMyWnd::OnMyMessage(WPARAM WParam, LPARAM LParam)
      {
         return (LRESULT)0;
      }--------------------如果你以前学过纯SDK的编程,你就知道为什么要返回一个LRESULT了,事实上,windows消息循环里面的任何一个消息处理函数都是有一个LRESULT的返回值的改成上面例子里面的格式就没有问题了:)
      

  2.   

    这是ON_MESSAGE宏在afxmsg_.h中的定义
    #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,所以void是不行的。而且在.net中类型检查更加严格。我试过了,用LRESULT编译可以过的。
      

  3.   

    vc.net 很严格,程序中的小逻辑错误都不放过