转自:http://blog.csdn.net/grasshopperwarbler/article/details/6337754

 

这里说的是SDI的情况,如果在vs2010里面按着默认选项创建一个单文档工程,

 

 

Access violation reading location 0x00000004--Visual Studio 2010中GetMenu()和GetSubMenu(0)引发异常的一个简单解决方法

 

然后想做一件事情 ,就是把一个默认的子菜单的一项钩选,

 

 

Access violation reading location 0x00000004--Visual Studio 2010中GetMenu()和GetSubMenu(0)引发异常的一个简单解决方法

代码如下 :

GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND|MF_CHECKED);

加在CMainFrame::Oncreate()里面,整个程序就会崩溃,出现的异常类似如此:Unhandled exception at 0x58aba12c (mfc100ud.dll) in menu1.exe: 0xC0000005: Access violation reading location 0x00000004.

发了不少帖子,也查了很多资料,却很少有明确的解决方法。

 

不过可以确定的是,在执行这段代码的时候,Menu并没有生成。因为采用断点来检测的话,此时的GetMenu返回值不是一个正常的地址。为什么会这样呢?

 

后来才发现visual studio2010里默认采用的是Menu格式在OnCreate()末端并未生成。vs2010默认采用的是增加了扩展功能的Menu,所以调用GetMenu()会得到空指针。

 

最原始的解决方法是采用回原来的Menu格式。就在新建工程的一个对话框中选择回原始的菜单模式即可,如下图:

 

 Access violation reading location 0x00000004--Visual Studio 2010中GetMenu()和GetSubMenu(0)引发异常的一个简单解决方法

不过经过更改后编译会出现两个错误,是关于:

ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)

 

两句代码是关于打印功能的。如果不涉及这方面的功能,可以直接把这两句话注释掉。然后在CMainFrame::OnCreate()末尾加上GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND|MF_CHECKED);

程序就可以顺利通过了。

相关文章:

  • 2021-12-31
  • 2022-12-23
  • 2022-12-23
  • 2021-12-11
  • 2022-01-09
  • 2022-01-09
  • 2022-12-23
  • 2021-12-03
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-09-14
  • 2021-11-20
  • 2021-06-25
  • 2021-04-12
  • 2021-07-22
相关资源
相似解决方案