我正在编写一个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处发生访问冲突?
提前致谢!
答案 0 :(得分:2)
请注意,此访问冲突不是您尝试读取或写入内存地址的更常见类型。在这种情况下,错误是您尝试在地址0x00000000
执行代码。这样就表明你正在调用一个地址为空指针的函数。
最明显的解释似乎是m_wndStatusBar.GetElement(0)
实际上不是CStatusBarPane*
。如果是这种情况,并且由于SetStatusIcon
是虚函数,您的代码将尝试在m_wndStatusBar.GetElement(0)
上执行vtable查找。显然,只有m_wndStatusBar.GetElement(0)
真正符合你的想法才能奏效。