MFC项目开发中常见错误10条
这是我第一份CSND博客.
在过去的两个月中,我跟老师一起做了一个"挑战杯"比赛的项目,当时我仅仅只有2个星期的MFC学习经历,对于多文档程序尤其感到头疼,这期间犯了很多错误,在此总结了10条错误供大家参考,其实我犯了的错误远远不止这些,好多都没有及时总结下来。如果您在编程开发中犯了一些错误,我建议你也及时记录下来,以备日后学习参考。
1.foepn()函数中文件名存贮单元越界易产生错误(尤其是存贮绝对地址的文件名时) 建议使用 CString 不要用strcpy()到 char .
2.平常在调试程序的时候应该尽量关闭 try...catch 以免错误发生了但是被异常处理接受而不能暴露错误;
而在程序发行时则应该使用异常处理 .
3.对于较大点的程序 应该一个一个类或者cpp文件的编译 不应该一次性全部编译 这样容易造成死机.
4.一个很无奈的错误 如果 你没有选择UpdateData();那么很多控件工作起来都是隐蔽的错误 令你伤透脑筋
5.missing storage-class or type specifiers 通常是由于没有包含头文件或者头文件 类名拼写错误造成的
在出错的地方检查
6.如果手动建立一个CFormView 的话,对话框的样式一定要正确设置 否则可引起程序不正常 正常样式为:
样式:下层 边框:无 无标题
这些问题就和用CTabCtrl建立属性页时要求一样
新建的用于选项卡中显示的对话框应设置为没有标题栏、Child风格、无边框的、非模式的。
7.当提示错误 error C2039: 'classCMyTestDlg' : is not a member of 'CMyTestDlg'
这种错误 查看后发现 根本没有错误 其实错在 宏定义上
在使用CoolBar 创建控制条项目时 需要宏定义:
例如CVCKBASEDlg类,在VCKBASEDlg.h中添加 DECLARE_DYNCREATE(CVCKBASEDlg)
在.CPP中增加 IMPLEMENT_DYNCREATE(CVCKBASEDlg, CDialog)
这些问题 就像串行化时 一样要注意.
8.如果在执行case语句时,你发现某几个的执行结果总是相同(预期是不同执行结果的话)那么你可能掉了某个break语句了。
9.出现了这种错误:
需要的头文件都添加了 每个文件单独编译都通过了 但是提示如下错误:
unsolved external symbol_playsound@12 ...
怎么调也出不来 这时你应该看看是否包含了Lib文件 事实上利用msdn查看需要条件如下:
Requirements
Windows NT/2000: Requires Windows NT 3.1 or later.
Windows 95/98: Requires Windows 95 or later.
Header: Declared in Mmsystem.h.
Library: Use Winmm.lib.
Unicode: Implemented as Unicode and ANSI versions on Windows NT/2000.
而我的错误恰恰是没有引用Winmm.lib 。这一点可以留着以后做参看 不仅仅是包含头文件 还需要看看其他要求
就像是 AnimateWindow 函数一样需要在stdAfx.h文件中添加一些版本的宏定义如下:
#undef WINVER
#define WINVER 0X500
10 获得活动视图 要严格区别 SDI程序与MDI程序
否则可能产生奇怪的错误
诸如First-chance exception in ***.exe: 0xC0000005: Access Violation. 的错误.
多文档的情况:
对于MDI程序,由于子窗口才是文档框窗,因此首先要用GetActiveFrame()取得活动子框架窗口,然后通过该子窗口获取活动视图和文档.
方法一:
CMDIChildWnd* pChild=(CMDIChildWnd*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveFrame();
取得活动视图:
CMyView *pView=(CMyView*)pChild->GetActiveView();
取得活动文档:
CMyDocument* pDoc=pChild->GetActiveDocument();
单文档情况:
对于SDI程序,主框架窗口就是文档框窗.
得到视图类的指针.
可以 先得到框架指针,然后调用 GetActiveView 函数指向当前活动视.
CMyView *pView;
pView=(CMyView*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)->GetActiveView(); .