Обнаружена проблема:
Сбой происходит во время разговора DispatchMessage( &msg )
Как правильно использовать эту функцию?
Старое сообщение ниже
Я пытаюсь скомпилировать свое первое 64-битное приложение Windows, используя Microsoft Visual Studio 2012 Ultimate и Windows SDK, который прилагается к нему (в прошлом я выполнял 64-битные программы на других системах), и я получаю аварийное завершение Unhandled Exception во время выполнения с этот блок кода точно в строке if (msg.message == WM_QUIT)
и я не могу понять это, программа прекрасно работает в 32-битной.
Все, что делает программа, это запускает и затем запускает этот блок как метод, он доходит до этой точки, прежде чем он падает.
Я компилирую и запускаю это на Windows 7.
MSG msg;
while ( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) {
// No message translation because we don't use WM_CHAR and it would conflict with our
// deadkey handling.
//if ( ExternalWindow && msg.hwnd == HWnd ) {
//WndProc(HWnd, msg.message, msg.wParam, msg.lParam);
//} else {
DispatchMessage( &msg );
//}
if ( msg.message == WM_QUIT ) {
Close = true;
}
}
Я связываюсь с этими библиотеками:
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
advapi32.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
odbc32.lib
odbccp32.lib
Извините, я не могу предоставить более подробную информацию. Я довольно незнаком с Windows SDK, и, как я уже говорил, это мое первое 64-битное Windows-приложение (оно отлично работает с 32-битным, так что я предполагаю, что это размер указателя / хранилище проблемы?).
РЕДАКТИРОВАТЬ: Это также не-Unicode, поэтому он вызывает PeekMessageA()
так же как DispatchMessageA()
,
EDIT2: WndProc()
просто читает пользовательский ввод, в данный момент это пустая функция, и мои контрольные точки говорят мне, что она не вызывается. ExternalWindow
имеет значение false и HWnd действителен, так как окна всплывают и отображаются перед сбоем.
EDIT3: вот содержимое msg
, message, wParam и lParam остаются одинаковыми при каждом запуске, очевидно, что точки, время и положение окна изменяются при каждом запуске.
msg {msg=0x0000031f wp=0x0000000000000001 lp=0x0000000000000000}
hdnw 0x00000000004a2594 {unused=-842150451 }
message 799
wParam 1
lParam 0
time 29882662
pt {x=1479 y=581}`
РЕДАКТИРОВАТЬ 4: Я вычеркнул функцию (возврат void в первой строке), конечно, приложение работает отлично только без возможности закрыть его, но я заметил, что заголовок окна больше не устанавливается, поэтому я предполагаю, что эта ошибка с созданием окна я опубликую свой код для этого через мгновение.
Вы испортили немного памяти. Это коренная причина. Слой Win32 хранит часть своих данных в памяти процесса. После того, как вы повредите его, функции Win32 могут потерпеть крах.
Удалите все из вашего приложения и оставьте только сообщение сообщения. Это должно работать. После этого добавьте мелкие кусочки. Если вы будете достаточно осторожны, вы заметите, какая часть представляет повреждение памяти.
Других решений пока нет …