Bootstrap

在VS2010中MFC的GetMenu访问冲突原因剖析以及解决办法

VC初学者经常出现的一个问题是:

根据孙鑫老师的《VC++深入详解》书中对菜单操作时,GetMenu->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION | MF_CHECKED); 出现错误如下,0x539001bc (mfc100d.dll) 处最可能的异常: 0xC0000005: 读取位置 0x00000004 时发生访问冲突。

返回从新跟踪一下,

CMenu* pMenu = GetMenu();
ASSERT(pMenu);
CMenu* pSubMenu = pMenu->GetSubMenu(0);
ASSERT(pSubMenu);
pSubMenu()->CheckMenuItem(0, MF_BYPOSITION | MF_CHECKED);

发现GetMenu没有返回值,出现读取错误,但是在VC6.0就可以正常实现。

究其原因,visual studio 2010里默认采用的是Menu格式在OnCreate()末端并未生成。vs2010默认采用的是增加了扩展功能的Menu,所以调用GetMenu()会得到空指针。

水平有限,修改方法如下

1、新建工程,vs2010默认的为实用菜单栏和工具栏,修改命令栏生成方式,改为经典


2、不新建工程,修改工程属性,比较方便,不知道能不能修改,求大神指教!

;