针对论坛常见的一些容易犯的常见错误,编制了一个代码找错题。
难易都有,睁大眼睛哦。
一道C++/MFC/VC6问题分析题

解决方案 »

  1.   

    01.#ifndef MYVIEW_H   
    02.  
    03.#define MYVIEW_H   
    04.  
    05.…   
    06.  
    07.#define WM_MYMSG WM_USER+200;   
    08.  
    09.#include “InfoDlg.h”     //CInfoDlg类的头文件名称   
    10.  
    11.    
    12.  
    13.class CMyView : public CView   
    14.  
    15.{   
    16.  
    17.       …   
    18.  
    19.public:   
    20.  
    21.              CInfoDlg m_InfoDlg; //信息展示浮动窗   
    22.  
    23.       …   
    24.  
    25.       protected:   
    26.  
    27.              …   
    28.  
    29.afx_msg void OnMyMsg(); //自定义的消息函数   
    30.  
    31....   
    32.  
    33.       …   
    34.  
    35.}  
    #ifndef MYVIEW_H#define MYVIEW_H…#define WM_MYMSG WM_USER+200;#include “InfoDlg.h”     //CInfoDlg类的头文件名称 class CMyView : public CView{       …public:              CInfoDlg m_InfoDlg; //信息展示浮动窗       …       protected:              …afx_msg void OnMyMsg(); //自定义的消息函数...       …} ====MyView.cpp=====view plaincopy to clipboardprint?
    01.…   
    02.  
    03.ON_MESSAGE(WM_MYMSG, OnMyMsg)   
    04.  
    05.…   
    06.  
    07.void OnMyMsg()  //消息响应函数   
    08.  
    09.{   
    10.  
    11.char *pMsg = new char(10);  //创建提示信息数组,长度为10   
    12.  
    13.if(pMsg = NULL)   //当new分配空间失败时,提示错误   
    14.  
    15.       AfxMessageBox(“分配空间失败。”);   
    16.  
    17.memset(pMsg,0,10); //数组清0   
    18.  
    19.CString sMsg = “HELLO WORLD”;       
    20.  
    21.pMsg = sMsg.GetBuffer(sMsg.GetLength());  //将HELLO WORLD赋值给数组   
    22.  
    23.CInfoDlg m_InfoDlg;   
    24.  
    25.m_InfoDlg.SetDlgItemText(IDC_INFO,pMsg); //在浮动窗中展示HELLO WORD   
    26.  
    27.}  
      

  2.   

    呵呵。char[10]会越界,对话框既然是非模态的,方法不对。
      

  3.   

    void CMyView::OnMyMsg()  //消息响应函数   
      
    {   
      
    char *pMsg = new char[10];  //创建提示信息数组,长度为10   
      
    if(pMsg == NULL)   //当new分配空间失败时,提示错误   
      
           AfxMessageBox(“分配空间失败。”);   
      
    memset(pMsg,0,10); //数组清0   
      
    CString sMsg = “HELLO WORLD”;       
      
    pMsg = sMsg.GetBuffer(0);//将HELLO WORLD赋值给数组   
      这里已经越界了。删除的时候肯定要报错
      
    InfoDlg.SetDlgItemText(IDC_INFO,pMsg); //在浮动窗中展示HELLO WORD   
     
     delete [] pMsg ;
    pMsg =NULL;
    }  
      

  4.   

    07: #define WM_MYMSG WM_USER+200; 
    -》
    #define WM_MYMSG WM_USRR+20029: afx_msg void OnMyMsg();   
    --》
    afx_msg LRESULT OnMyMsg(WPARAM wParma, LPARAM lParam);03:ON_MESSAGE(WM_MYMSG, OnMyMsg)  
    -》
    VC6可以这样写,但是
    VS2005,2008下ON_MESSAGE(UM_MYMSG, &CMyView::OnMyMsg);07:void OnMyMsg() 
    -》
    void CMyView::OnMyMsg(WPARAM wParam, LPARAM lParam)11. char *pMsg = new char(10); 
    -》
    char *pMsg = new char[10];
     
    13. if(pMsg = NULL)
    -》
    if(NULL == pMsg)15:AfxMessageBox(“分配空间失败。”);  
    -》
    AfxMessageBox(_T("分配空间失败")); 
    return 0; // 这里还要return返回19: CString sMsg = “HELLO WORLD”;     
    -》
    CString sMsg = _T("HELLO WORLD");21. pMsg = sMsg.GetBuffer(sMsg.GetLength()); 
    -》
    GetBuffer以后没有ReleaseBuffer,另外的指针pMsg new分配的内存也无法释放了25: 常见错误了,窗口还没有创建
      

  5.   

    (1)OnMyMsg()//消息响应函数有参数的....
    (2)char *pMsg = new char(10);//这个创建是错误的
    (3)pMsg = NULL 这个是赋值
    (4)AfxMessageBox(“分配空间失败。”);//即使错误还是会继续执行
    (5)申请的内存没有释放
    (6)没有有ReleaseBuffer;
    (7)将pMsg移动了,没有指针指向申请的内存,
      

  6.   

    问题可多了
    1.#define WM_MYMSG WM_USER+200; 宏定义有问题,分号多余,最好定义为
    #define WM_MYMSG (WM_USER+200)
    2.CInfoDlg m_InfoDlg;最好为私有
    3.afx_msg void OnMyMsg(); 自定义的消息函数改为afx_msg LRESULT OnMyMsg(WPARAM wParam, LPARAM lParam);
    vc6中可能没有问题,但是vs2005-2010有严格的要求,必须为上述声明形式
    4.类最后没加分号
    5.char *pMsg = new char(10);这个是定义的是一个指向char型的指针,根本不是数组;
    6.if(pMsg = NULL) 应该为if(pMsg == NULL)
    7.pMsg = sMsg.GetBuffer(sMsg.GetLength()); 用了getbuffer,还要使用releasebuffer
    8,delete []pMsg;
      

  7.   

    21: CInfoDlg m_InfoDlg; //信息展示浮动窗   
    没有引用的变量,不需要
      

  8.   

    void OnMyMsg();//全局函数
    CInfoDlg m_InfoDlg; //重复定义了
      

  9.   

    OnMyMsg函数中写了太多不需要的东西
      

  10.   

    同意CString sMsg = _T(“HELLO WORLD”);  
     InfoDlg  创建以后
    InfoDlg.SetDlgItemText(IDC_INFO,sMsg ); //在浮动窗中展示HELLO WORD   
    就完了。
      

  11.   

    头文件中最后没有分号afx_msg void OnMyMsg(); //自定义的消息函数   
      
    ...   
      
           …   
      
      

  12.   

    删除头文件中的21行 CInfoDlg m_InfoDlg; //信息展示浮动窗   的话,
    第9行的#include “InfoDlg.h”     //CInfoDlg类的头文件名称  
    就没有比较写到头文件中,最好是写到cpp文件中
      

  13.   

    还有没有注意Unicode编码的问题