Необработанное исключение, вытекающее из IMPLEMENT_DYNCREATE - проект VC6, обновление до VS2010 - PullRequest
0 голосов
/ 12 января 2012

Я пытаюсь обновить существующее приложение VC6 MFC до VS2010, после пары небольших исправлений старого файла .C я смог его скомпилировать. К сожалению, когда он запускается в режиме отладки или выпуска, я получаю:

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

Проведя некоторое время с отладчиком, я обнаружил, что строка с ошибкой была

IMPLEMENT_DYNCREATE(COverUnderReportDoc, CReportDoc)

в моем классе COverUnderReportDoc. Если я войду в функцию, она успешно выполнит все строки и вернется, но когда я выйду за строку после ее возврата, я получу исключение необработанного.

Есть идеи?

Редактировать: Копнув дальше в стек вызовов, я проследил точный источник сбоя до этой строки

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
...