找到事件处理程序

时间:2012-08-09 03:28:40

标签: c++ visual-studio-2008 mfc event-handling breakpoints

我有一个非常大的MFC应用程序的源代码,文档很差。我试图在执行时跟踪代码,以便了解它正在做什么。不幸的是,只要用户获得对应用程序的控制权,我就需要在事件处理程序上设置断点,以便在调试器中再次开始跟随。如果我尝试逐行遍历代码,那么用户将永远无法控制应用程序,因为它会逐步开始逐步执​​行空闲例程。

我需要的是在单击按钮之前确定与按钮关联的事件处理程序的名称。这样,我可以在该事件处理程序上设置一个断点,并在按下后立即浏览相关代码。

由于应用程序的大小,在每个事件处理程序中手动设置断点是不可行的。如果有一种简单的方法可以在包含特定模式的所有行上设置断点,那么这也会起作用。我可以搜索(alt + e + f + i)':: On',并在一次成千上万次点击中设置断点。我必须手动取消选择那些无意中触发的断点,但这仍然有效。有没有办法做到这一点?

此外,我已经尝试搜索资源查看器并找到看起来像我想要的按钮,但一直无法找到它。即使我这样做,我也不确定这会有什么帮助。难道不应该有一个很好的简单列表,其中列出了图形元素及其相关事件吗?

我剩下的选项是什么?

2 个答案:

答案 0 :(得分:2)

好的,我要做的第一件事就是您已经尝试过的事情:在资源查看器中查找相关控件的资源ID。如果您有ID,则可以在类声明中搜索它,其中将有MFC宏将“click”事件映射到该控件的回调。回调当然是你正在寻找的事件处理程序。

因此,如果您无法用眼睛找到按钮,请搜索它。有几个合理的可能性:

  1. 它在资源文件中但你看不到它 - 也许它被其他按钮覆盖;
  2. 它在应用程序中动态命名;
  3. 它是在应用程序中动态创建的。
  4. 在项目中搜索按钮上显示的文本 - 匹配大小写并首先尝试包含引号,如果不成功则不带引号。您可能必须手动打开并搜索资源文件(关闭资源编辑器并将RC文件作为文本加载到Visual Studio中,然后搜索)。

    如果它在资源文件中,您将能够将控件与ID匹配。如果您根本找不到它,请检查字符串表。如果它在字符串表中,则追溯使用该字符串资源的位置。

    在动态命名和/或创建的情况下,您可能需要做更多的侦探工作。

    这种方法可能发生的最糟糕的事情是按钮上的文字出现在整个项目中,或按钮上有一个图标而没有文字。如果你真的很挣扎,你可以通过使用Spy ++来获取有关按钮的信息。您应该能够从中检索数字ID,然后在resource.h中搜索它。

    玩得开心!

答案 1 :(得分:1)

假设您的应用程序是一个相当标准的MFC应用程序,几乎所有按钮点击都将通过消息映射处理,并且看起来像:

ON_BN_CLICKED( IDC_BUTTONID, OnMyButtonClicked )

将按钮IDC_BUTTONID的BN_CLICKED通知映射到方法OnMyButtonClicked。

因此,查找事件处理程序的最简单方法是在源代码中搜索按钮的资源ID(您应该在对话框编辑器或.rc文件中找到它)。显然,如果你想更具体一点,你可以进行正则表达式搜索,例如

ON_BN_CLICKED.*IDC_BUTTONID

该项可能看起来像一个按钮,但实际上并不是一个按钮,或者它是通过OnCmdMsg手动路由的,在这种情况下,您可能最好寻找点击的症状(即一些代码你必须运行KNOW)在那里放置一个中断然后跟随调用堆栈以查看消息的处理方式。

对于广泛的源代码搜索,我建议您查看专用的第三方搜索程序,例如Agent RansackWinGrep