我不熟悉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/

10-11 22:48
查看更多