0

問題が見つかりました:

クラッシュは call 内で発生します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 ビットで問題なく動作するため、ポインターのサイズ/ストレージであると推測しています)。問題?)。

編集:これも非ユニコードであるため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:関数をダミーで作成しました(1行目でvoidを返します)。もちろん、アプリケーションは閉じる機能がなくても完全に正常に動作しますが、ウィンドウのタイトルが設定されていないことに気付いたので、このエラーはウィンドウを作成したら、そのためのコードをすぐに投稿します。

4

1 に答える 1