调试时MFC断言失败

时间:2013-11-18 10:56:47

标签: c++ visual-c++ mfc assert

我不熟悉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,它本身就是对内存的写入。

我不知道为什么。我该如何解决这个问题?

3 个答案:

答案 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)这个解决方案解决了我自己的问题。

相关问题