发现问题:
崩溃发生在调用DispatchMessage( &msg )
内,这个函数的正确使用是什么?
以下旧信息
我正在尝试使用Microsoft Visual Studio 2012 Ultimate和随附的Windows SDK编译我的第一个64位Windows应用程序(我过去在其他系统上完成了64位程序)并且我收到了一个未处理的异常崩溃在运行时,这段代码正好在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
的内容,消息,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}`
EDIT4:我愚弄了这个函数(在第一行返回void),当然应用程序运行完全正常但没有关闭它的能力,但我注意到窗口标题不再被设置,所以我猜这个错误是随着窗口的创建,我稍后会发布我的代码。
答案 0 :(得分:1)
你损坏了一些内存。这是根本原因。 Win32层将其部分数据保存在进程的内存中。一旦你破坏它,Win32功能可能会崩溃。
从应用程序中删除所有内容,只留下消息泵。这应该工作。之后,在小块中添加东西。如果你足够小心,你会注意到哪一部分引入了内存损坏。