問題が見つかりました:
クラッシュは 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を返します)。もちろん、アプリケーションは閉じる機能がなくても完全に正常に動作しますが、ウィンドウのタイトルが設定されていないことに気付いたので、このエラーはウィンドウを作成したら、そのためのコードをすぐに投稿します。