0

我正在编写一个 MFC 应用程序,并创建了一个CStatusBarPane公开派生自CMFCRibbonStatusPane. 这个派生类包含一个简单的方法,如下所示:

virtual void SetStatusIcon( _In_ HICON hIcon )
{
     m_hIconSmall = hIcon;
     Redraw();
}

创建主框架后(连同状态栏及其子窗格),我调用以下函数:

void CMainFrame::UpdateStatusBar( _In_ const std::tstring& szStatus, _In_opt_ HICON hIcon )
{
     CStatusBarPane* pStatusBarPane = static_cast<CStatusBarPane*>(m_wndStatusBar.GetElement(0));

     pStatusBarPane->SetText( szStatus.c_str() );
     pStatusBarPane->SetStatusIcon( hIcon );
}

pStatusBarPane->SetStatusIcon( hIcon )但是,当我调试应用程序时,它会使用以下语句引发异常:

Project.exe 中 0x00000000 处的第一次机会异常:0xC0000005:访问冲突执行位置 0x00000000。

但是,查看变量跟踪表明没有空指针被访问,所以我不明白如何在地址 0 处发生访问冲突?

提前致谢!

4

1 回答 1

2

请注意,这种访问冲突不是您尝试读取或写入内存地址的更常见类型。在这种情况下,错误是您试图在 address 处执行代码0x00000000。所以这表明你正在调用一个地址是空指针的函数。

最明显的解释似乎m_wndStatusBar.GetElement(0)是实际上不是CStatusBarPane*. 如果是这种情况,并且由于SetStatusIcon是一个虚函数,您的代码将尝试在m_wndStatusBar.GetElement(0). 显然,只有当m_wndStatusBar.GetElement(0)你认为它真的是这样时,它才会起作用。

于 2013-07-15T10:55:40.480 回答