一道C++/MFC/VC6问题分析题 针对论坛常见的一些容易犯的常见错误,编制了一个代码找错题。难易都有,睁大眼睛哦。一道C++/MFC/VC6问题分析题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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.} 呵呵。char[10]会越界,对话框既然是非模态的,方法不对。 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;} 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: 常见错误了,窗口还没有创建 (1)OnMyMsg()//消息响应函数有参数的....(2)char *pMsg = new char(10);//这个创建是错误的(3)pMsg = NULL 这个是赋值(4)AfxMessageBox(“分配空间失败。”);//即使错误还是会继续执行(5)申请的内存没有释放(6)没有有ReleaseBuffer;(7)将pMsg移动了,没有指针指向申请的内存, 问题可多了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,还要使用releasebuffer8,delete []pMsg; 21: CInfoDlg m_InfoDlg; //信息展示浮动窗 没有引用的变量,不需要 void OnMyMsg();//全局函数CInfoDlg m_InfoDlg; //重复定义了 OnMyMsg函数中写了太多不需要的东西 同意CString sMsg = _T(“HELLO WORLD”); InfoDlg 创建以后InfoDlg.SetDlgItemText(IDC_INFO,sMsg ); //在浮动窗中展示HELLO WORD 就完了。 头文件中最后没有分号afx_msg void OnMyMsg(); //自定义的消息函数 ... … } 删除头文件中的21行 CInfoDlg m_InfoDlg; //信息展示浮动窗 的话,第9行的#include “InfoDlg.h” //CInfoDlg类的头文件名称 就没有比较写到头文件中,最好是写到cpp文件中 还有没有注意Unicode编码的问题 向各位求教一个关于数学函数定义的问题 高分求:如何用CAsyncSocket类通信来实现结构体的传送? 格式化? 关于Clistctrl控件的小问题 在MFC的视图中如何实现点击一幅图片的不同区域做出不同的响应 请大家帮我看看我的一个动态变化的图形程序(俄罗斯方快的下落过程) 了解DDE的高手请。 求vc编写的dde server和client的源码例子 一个奇怪的问题 GetBuffer用过吗 用while CTypedPtrArray win32程序,进入主函数之前产生大量sock错误!!
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.}
{
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;
}
-》
#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: 常见错误了,窗口还没有创建
(2)char *pMsg = new char(10);//这个创建是错误的
(3)pMsg = NULL 这个是赋值
(4)AfxMessageBox(“分配空间失败。”);//即使错误还是会继续执行
(5)申请的内存没有释放
(6)没有有ReleaseBuffer;
(7)将pMsg移动了,没有指针指向申请的内存,
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;
没有引用的变量,不需要
CInfoDlg m_InfoDlg; //重复定义了
InfoDlg 创建以后
InfoDlg.SetDlgItemText(IDC_INFO,sMsg ); //在浮动窗中展示HELLO WORD
就完了。
...
…
}
第9行的#include “InfoDlg.h” //CInfoDlg类的头文件名称
就没有比较写到头文件中,最好是写到cpp文件中