Следующий код будет давать жесткий сбой при запуске под Windows 7 32bit:исключения 64bit в WndProc молча терпеть неудачу
void CTestView::OnDraw(CDC* /*pDC*/)
{
*(int*)0 = 0; // Crash
CTestDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: add draw code for native data here
}
Однако, если я пытаюсь это на Windows 7 64bit, я просто получить это в окне вывода :
первого шанса исключение в 0x13929384 в tEST.exe: 0xC0000005: нарушение прав доступа месте для записи 0x00000000.
первого шанса на исключение 0x77c6ee42 в test.exe: 0xC0150010: контекст активации деактивируется не активен для текущего потока исполнения.
В чем причина этого? Я знаю, что это аппаратное исключение (http://msdn.microsoft.com/en-us/library/aa363082.aspx), но почему разница при работе под 32 бит и 64 бит? И что я могу сделать, чтобы правильно обрабатывать такие ошибки? Поскольку они действительно должны быть пойманы в ловушку и исправлены, в отличие от того, что в настоящее время происходит, поскольку Windows просто переносит сообщения в приложение и запускает его (так что пользователь и разработчики совершенно не знают, что на самом деле возникли какие-либо проблемы).
Update: Наше обычное программное обеспечение аварии отчетов использует SetUnhandledExceptionFilter
но не дозвонились на x64 для аппаратных исключений внутри WndProc. У кого-нибудь есть информация об этом или обходной путь?
Update2: Я сообщил о проблеме в Microsoft Connect:
https://connect.microsoft.com/VisualStudio/feedback/details/550944/hardware-exceptions-on-x64-machines-are-silently-caught-in-wndproc-messages
Я не думаю, что просто компиляции для 64-битных вариант? – jalf
Компиляция для x64 на самом деле не является опцией, наш исходный код состоит из примерно 1 миллион строк кода, а также значительного количества ассемблера. Объедините это с добавленной стоимостью для запуска двух отдельных сборок через QA и т. Д. –
См. Также раздел замечаний [Функция обратного вызова WindowProc] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633573% 28v = vs.85% 29.aspx) – wimh