MFC 功能区在 Windows 2008 中崩溃

Posted

技术标签:

【中文标题】MFC 功能区在 Windows 2008 中崩溃【英文标题】:MFC Ribbon crashes in windows 2008 【发布时间】:2012-10-30 16:04:42 【问题描述】:

我有一个使用 MFC 功能区的应用程序。它是在 Visual Studio 2010 中开发的。我遇到了一个奇怪的问题。该应用程序在 Windows 7 和 Windows 2008 R2 中运行良好。但是,当它尝试从资源加载功能区时,它会在 Windows 2008 中崩溃。确切的行是

ribbonBar->LoadFromResource(IDR_RIBBON1); //IDR_RIBBON1是资源id。

堆栈跟踪在下面

gui.exe!ATL::CComPtrBase<IXMLDOMDocument>::~CComPtrBase<IXMLDOMDocument>()  Line 162 + 0xa bytes    C++
gui.exe!ATL::CComPtr<IXMLDOMDocument>::~CComPtr<IXMLDOMDocument>()  + 0x11 bytes    C++
gui.exe!ATL::CComQIPtr<IXMLDOMDocument,&_GUID_2933bf81_7b36_11d2_b20e_00c04f983e60>::~CComQIPtr<IXMLDOMDocument,&_GUID_2933bf81_7b36_11d2_b20e_00c04f983e60>()  + 0x11 bytes    C++
gui.exe!ATL::CXMLNode<IXMLDOMDocument>::~CXMLNode<IXMLDOMDocument>()  Line 47 + 0xb bytes   C++
gui.exe!ATL::CXMLDocument::~CXMLDocument()  Line 269 + 0x13 bytes   C++
gui.exe!CXMLParserRoot::~CXMLParserRoot()  Line 423 + 0x43 bytes    C++
gui.exe!CMFCRibbonInfo::Read(unsigned char * lpBuffer=0x013acb14, unsigned int nSize=83851)  Line 703 + 0x15 bytes  C++
gui.exe!CMFCRibbonInfoLoader::LoadFromBuffer(unsigned char * lpBuffer=0x013acb14, unsigned int nSize=83851)  Line 112 + 0x1b bytes  C++
gui.exe!CMFCRibbonInfoLoader::Load(const char * lpszResID=0x000005d8, const char * lpszResType=0x0000001c, HINSTANCE__ * hInstance=0x00400000)  Line 85 + 0x1c bytes    C++
gui.exe!CMFCRibbonBar::LoadFromResource(const char * lpszXMLResID=0x000005d8, const char * lpszResType=0x0000001c, HINSTANCE__ * hInstance=0x00000000)  Line 740 + 0x17 bytes   C++
gui.exe!CMFCRibbonBar::LoadFromResource(unsigned int uiXMLResID=1496, const char * lpszResType=0x0000001c, HINSTANCE__ * hInstance=0x00000000)  Line 731    C++

非常感谢任何有关如何解决此问题的建议和建议。做,问你是否需要更多信息。

【问题讨论】:

目前还不清楚崩溃的实际情况。析构函数调用中的访问冲突几乎总是由堆损坏引起的。这种损坏不是由功能区控件引起的,而是由较早运行的代码引起的。 【参考方案1】:

我知道这个答案已经晚了几年,但我在更新旧的 MFC 应用程序以支持功能区时遇到了同样的问题。 为了使LoadResources 正常工作,需要做的是在App 类中的InitInstance() 期间调用AfxOleInit()。我在加载 MFC 框架之前执行此操作。

希望这会有所帮助!

【讨论】:

谢谢。添加对 AfxOleInit() 的调用解决了我在 Windows 10 上的问题,也使用 VS 2017。【参考方案2】:

您是否尝试在已部署的机器上安装可再发行包? Windows (Server) 2008 R2 可能带有 Visual C++ 2010 Redistributable 包,而 Windows Server 2008 没有。还要考虑到,如果您将 Visual Studio 更新到 SP1,您应该使用 SP1 的可再发行包。

【讨论】:

我已经在我的机器上安装了 Visual C++ 2010 Redistributable x86,即 Windows 2008 SP2。该应用程序无法运行。

以上是关于MFC 功能区在 Windows 2008 中崩溃的主要内容,如果未能解决你的问题,请参考以下文章

用vs2008编译器,创建一个MFC程序,为啥第一次运行一定要崩溃呢?

在 MFC CPropertySheet 中添加 ActiveX 控件的问题(Windows 7 64 位和 Windows 2008 Server)

MFC 应用程序在 NTDLL.dll 中崩溃

用vs2008做的MFC程序,怎么在WINDOWS XP下运行?

.Net 4.0 Windows 应用程序在 Windows Server 2008 下的 clr.dll 中崩溃

MFC 功能区:CView::OnUpdate 中的 RemoveAllSubItems() 导致访问冲突 (VS2008)