4

ドキュメントが不十分な非常に大規模なMFCアプリケーションのソースコードがあります。コードが何をしているのかを理解するために、実行中のコードをトレースしようとしています。残念ながら、ユーザーがアプリケーションを制御できるようになるとすぐに、デバッガーでフォローを再開するために、イベントハンドラーにブレークポイントを設定する必要があります。コードを1行ずつステップ実行しようとすると、アプリケーションがアイドル状態のルーチンをステップバイステップでウォークスルーし始めるため、ユーザーがアプリケーションを制御できるようになることはありません。

必要なのは、ボタンをクリックする前に、ボタンに関連付けられているイベントハンドラーの名前を確認することです。そうすれば、そのイベントハンドラーにブレークポイントを設定し、押されたらすぐに関連するコードをウォークスルーできます。

アプリケーションのサイズが原因で、すべてのイベントハンドラーでブレークポイントを手動で設定することはできません。特定のパターンを含むすべての行にブレークポイントを設定する簡単な方法があれば、それも機能します。(alt + e + f + i)で「:: On」を検索し、結果として得られた何千ものヒットにブレークポイントを一度に設定できます。その方法で誤ってトリガーされたすべてのブレークポイントを手動で選択解除する必要がありますが、これでも機能します。これを行う方法はありますか?

さらに、リソースビューアを検索して、目的のボタンに似たものを見つけようとしましたが、見つかりませんでした。たとえそうしたとしても、それがどのように役立つかはわかりません。関連するイベントと一緒にグラフィック要素をリストする素敵な簡単なリストがどこかにあるべきではありませんか?

私の残りのオプションは何ですか?

4

2 に答える 2

2

さて、私が最初にすることは、あなたがすでに試したことがあるようです: リソース ビューアで関連するコントロールのリソース ID を探します。ID がある場合は、そのコントロールのコールバックに「クリック」イベントをマッピングする MFC マクロがあるクラス宣言でそれを検索できます。もちろん、コールバックは、探しているイベント ハンドラーです。

なので、目でボタンが見つからない場合は探してみてください。いくつかの合理的な可能性があります。

  1. リソース ファイルにありますが、表示されません。他のボタンで覆われている可能性があります。
  2. アプリケーションで動的に名前が付けられます。
  3. アプリケーションで動的に作成されます。

ボタンに表示されるテキストをプロジェクトで検索します。大文字と小文字を区別し、最初に引用符を含めてみてください。失敗した場合は、引用符を含めないようにしてください。リソース ファイルを手動で開いて検索する必要がある場合があります (リソース エディターを閉じて、RC ファイルをテキストとして Visual Studio に読み込んでから検索します)。

リソース ファイルにある場合は、コントロールを ID に一致させることができます。まったく見つからない場合は、文字列テーブルを確認してください。文字列テーブルにある場合は、その文字列リソースが使用されている場所をトレース バックします。

動的な命名および/または作成の場合、もう少し調査作業が必要になる場合があります。

このアプローチで起こりうる最悪の事態は、ボタンのテキストがプロジェクト全体に表示されるか、ボタンにアイコンがあってテキストが表示されないことです。本当に苦労している場合は、Spy++ を使用してボタンに関する情報を取得することで、どこかに到達できる可能性があります。そこから数値 ID を取得して、 で検索できるはずですresource.h

楽しむ!

于 2012-08-09T04:26:56.537 に答える
1

アプリがかなり標準的な MFC アプリであると仮定すると、ほとんどすべてのボタン クリックはメッセージ マップを通じて処理され、次のようになります。

ON_BN_CLICKED( IDC_BUTTONID, OnMyButtonClicked )

ボタン IDC_BUTTONID の BN_CLICKED 通知をメソッド OnMyButtonClicked にマップします。

したがって、イベント ハンドラーを見つける最も簡単な方法は、ソース コードでボタンのリソース ID を検索することです (ダイアログ エディターまたは .rc ファイルで見つける必要があります)。明らかに、もう少し具体的にしたい場合は、正規表現検索を行うことができます。

ON_BN_CLICKED.*IDC_BUTTONID

アイテムがボタンのように見えても実際にはボタンではない、または OnCmdMsg を介して手動でルーティングされている可能性があります。 run) そこに休憩を入れてから、コール スタックをたどって、メッセージがどのように処理されているかを確認します。

広範なソース コード検索については、 Agent RansackWinGrepなどの専用のサード パーティ検索プログラムを検討することをお勧めします。

于 2012-08-09T08:46:09.260 に答える