来自IMPLEMENT_DYNCREATE的未处理异常 - VC6项目,升级到VS2010

时间:2012-01-11 21:14:15

标签: c++ visual-studio-2010 mfc vc6 unhandled-exception

我正在尝试将现有的VC6 MFC应用程序升级到VS2010,在对旧的.C文件进行了几次小修复后,我才能进行编译。不幸的是,当它在调试或发布模式下运行时,我得到:

Unhandled exception at 0x00000000 in OverUnderReport.exe: 0xC0000005: Access violation reading location 0x00000000.

在调试器上花了一些时间之后,我发现有问题的代码行是

IMPLEMENT_DYNCREATE(COverUnderReportDoc, CReportDoc)

在我的COverUnderReportDoc类中。如果我进入函数,它会成功执行所有行并返回,但是当我在返回后跳过该行时,我会得到Unhandled Exception。

有什么想法吗?

编辑:进一步挖掘调用堆栈后,我已将此崩溃的确切来源追踪到此行

pObject = (*m_pfnCreateObject)();

在下面的try块中。

CObject* CRuntimeClass::CreateObject()
{
    ENSURE(this);

if (m_pfnCreateObject == NULL)
{
    TRACE(traceAppMsg, 0,
        _T("Error: Trying to create object which is not ")
        _T("DECLARE_DYNCREATE \nor DECLARE_SERIAL: %hs.\n"),
        m_lpszClassName);
    return NULL;
}

CObject* pObject = NULL;
TRY
{
    pObject = (*m_pfnCreateObject)();
}
END_TRY

return pObject;
}

打破时,编译器拉出memset.asm并突出显示下面代码块中的最后一行

; Set dword-sized blocks
    mov     ecx,edx         ; move original count to ecx
    and     edx,3           ; prepare in edx byte count (for tail loop)
    shr     ecx,2           ; adjust ecx to be dword count
    jz      tail            ; jump if it was less then 4 bytes

    rep     stosd

0 个答案:

没有答案