0

VisualStudioで非常に古いCプログラムをデバッグしようとしています。コードを1行ずつステップ実行していて、コードが次にどこに行くのかを確認したい行DispatchMessage(&msg);に到達したので、[ステップイン]ボタンをクリックしましたが、メッセージを処理する新しいコードは表示されませんでした。小さな黄色い矢印が同じページの次の行に沿って進んだ...

これは予想される動作ですか?DispatchMessage実際に何が行われたかをどのように確認できますか?これは、ウィンドウハンドラーが正しく設定されていないことを示している可能性がありますか?

追加情報:私がデバッグしようとしていたタスクは、特定のウィンドウでのマウスクリックの処理でした。msg構造を表示し、msg.hwndはクリックしたウィンドウでした(Winspectorを使用て確認しました)。msg.messageは513(= WM_LBUTTONDOWN)でした。

4

1 に答える 1

3

これは完全に予想される動作です...

DispatchMessage()に実装されUser32.dllているため、ソース コードは利用できません。ほとんどの場合、Win32 API 呼び出しをブラックボックスとして扱う必要があります。場合によっては、これにより Win32 コードのデバッグが非常に困難になることがあります。

この種のものをデバッグするためのいくつかのトリックがあなたの武器庫にあることを覚えておいてください:

  1. DispatchMessage()ブラックボックスとして扱い続ける。WndProcを受信すると予想される にブレークポイントを配置し、WM_LBUTTONDOWNそこでデバッグを続行します。

  2. 関連するすべてのウィンドウに着信するメッセージを Winspector に記録させます。これにより、メッセージが期待どおりの順序で受信されていることを確認できます。

  3. 最悪の事態が発生した場合はDispatchMessage()、その逆アセンブルを調べて、ステップインするか、他の API 呼び出しを行う必要がある場合があります。ほとんどの場合、そこからは何も得られません (しかし、私は常に何かを学びます)。

オプション #3 は必要ない可能性があり、その時間はそのDispatchMessage()中でデバッグするよりもデバッグに費やすほうがよいでしょう。

于 2012-12-16T14:53:01.003 に答える