系统消息未处理的异常

时间:2013-07-20 18:30:04

标签: c++ winapi visual-studio-2012 64-bit unhandled-exception

发现问题:

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

1 个答案:

答案 0 :(得分:1)

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

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