我自己新建的一个MFC单稳当的工程,在vc6.0++环境中是没有任何问题的,可以正确编译运行。但是在VS2008下就会报错。错误如下:
1>.\ImageTestDoc.cpp(20) : error C2440: “static_cast”: 无法从“BOOL (__thiscall CImageTestDoc::* )(LPCTSTR)”转换为“AFX_PMSG”
1>        从基类型到派生类型的强制转换需要 dynamic_cast 或 static_cast
在头文件中,函数的声明如下:
       afx_msg BOOL OnOpenImageFile(LPCTSTR lpszPathName);
然后,消息函数的映射为:
       BEGIN_MESSAGE_MAP(CImageTestDoc, CDocument)
ON_COMMAND(ID_FILE_OPEN, &CImageTestDoc::OnOpenImageFile)
       END_MESSAGE_MAP()
最后,在函数实现上是这样的:
      BOOL CImageTestDoc::OnOpenImageFile(LPCTSTR lpszPathName)
      {
      .......
      }
关键就是函数返回值的问题,如果是void类型的好像就没有问题。因为这是一个单稳当的MFC,我只是想给文件->打开的菜单添加一个事件,但是利用VS2008的添加事件的默认好像是void的类型的,我就改成了BOOL值了,因为我想如果打开一个文件成功就返回true,否则返回false。可是现在就不能通过编译。请高手指点一下。

解决方案 »

  1.   

    命令消息响应函数的返回值必须为void类型的。
    查看MFC关于ON_COMMAND定义
    #define ON_COMMAND(id, memberFxn) \
    { WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSig_vv, (AFX_PMSG)&memberFxn }
               //由上面语句可知命令消息响应函数必须为AFX_PMSG类型的,而AFX_PMSG类型的函数定义如下
    typedef void (AFX_MSG_CALL CCmdTarget::*AFX_PMSG)(void);
    这和你是否使用vc2008无关
      

  2.   

    MFC中,命令消息响应函数的返回值必须是void类型,参数类型也必须是void类型。
      

  3.   

    VS2008的一些消息响应函数的返回类型修改了,所以你从旧的VC项目迁移的时候一定要改过来。找到这些函数,把返回类型改成VS2008要求的。我也遇到过这样情况:
    LRESULT Cxxxxx::OnNcHitTest(CPoint point)
    这个函数的返回类型原来好像是ULONG,改成LRESULT就好了。
    Try it。试试才知道。
      

  4.   

    哦?看了看,你这不是我说的问题。Sorry