0

发现问题:

崩溃发生在调用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),当然应用程序运行得很好,只有无法关闭它,但我注意到不再设置窗口标题,所以我猜这个错误是随着窗口的创建,我稍后会发布我的代码。

4

1 回答 1

1

您损坏了一些内存。这是根本原因。Win32层将它的一些数据保存在进程的内存中。一旦你损坏它,Win32 函数可能会崩溃。

从您的应用程序中删除所有内容,只留下消息泵。这应该有效。之后加入小块的东西。如果您足够小心,您会注意到哪个部分引入了内存损坏。

于 2013-07-21T01:45:20.633 回答