我不熟悉MFC,但目前我必须继续用MFC编写的项目。现在我在调试
时遇到以下问题m_hIcon = AfxGetApp()->LoadIcon (IDR_MAINFRAME);
在“断言失败:at 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
,它本身就是对内存的写入。
我不知道为什么。我该如何解决这个问题?
答案 0 :(得分:0)
MFC代码需要正确的模块句柄来加载资源。 请尝试阅读Afx * G / S * etResourceHandle。
答案 1 :(得分:0)
默认情况下,MFC使用主应用程序的资源句柄,而不是DLL。如果您在DLL中进行调用,则在导出的DLL函数的开头添加此行:
AFX_MANAGE_STATE(AfxGetStaticModuleState());
此处有更多相关信息:
http://msdn.microsoft.com/en-us/library/ba9d5yh5(v=vs.110).aspx
答案 2 :(得分:0)
MFC中的断言错误通常在设置了错误设置时发生。
转到项目设置>链接器>系统和更改子系统到(/ SUBSYSTEM:WINDOWS)这个解决方案解决了我自己的问题。