我不熟悉MFC,但目前我必须继续使用MFC编写的项目。现在我在调试时遇到以下问题
m_hIcon = AfxGetApp()->LoadIcon (IDR_MAINFRAME);
它总是在错误“断言失败:在afxwin1.inl”之后停止。如果在此处放置断点,则会看到NULL图标句柄。我尝试在发布模式下运行,尽管句柄仍然为NULL,但它工作得很好。我已经读过this question,但是我的程序不是静态库。这是一个使用dll连接到CAN总线设备的程序。资源
IDR_MAINFRAME
已经在项目中。它包含默认的MFC图标。我怎么解决这个问题?我尝试调试,发现
pModuleState
在第一个加载程序名称调用和第二个加载图标调用之间发生了变化。第一次调用成功返回,因为pModuleState指向具有有效句柄的对象。但是在图标加载调用中,pModuleState指向某个包含NULL句柄的对象。我也尝试将AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
放在LoadIcon()
调用上方,但问题仍然出现我知道这个问题的原因
UINT __cdecl RunCPRead(LPVOID pParam)
{
CMyDlg *thisclass = (CMyDlg *)pParam;
while (thisclass->m_Start)
{
thisclass->GetData();
}
return 0;
}
AfxBeginThread(&RunCPRead, this, THREAD_PRIORITY_NORMAL, 0, 0, NULL);
在
GetData()
中调用RunCPRead
之后,尽管没有创建或复制任何对象,但控件直接流到CMyDlg的构造函数CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
然后在分配给m_hIcon时失败,并显示错误“读取时访问冲突”。我已经看到了反汇编,它是
mov dword ptr [esi+90h], eax
行,它本质上是对内存的写操作。我不知道为什么我该如何解决?
最佳答案
MFC代码需要正确的模块句柄才能加载资源。
请尝试阅读Afx * G / S * etResourceHandle。
关于c++ - 调试时MFC断言失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20046041/