2012-08-09 49 views
3

我有一个非常大的MFC应用程序与文档较差的源代码。我试图在执行代码时跟踪代码,以了解它在做什么。不幸的是,一旦用户获得了对应用程序的控制,我需要在事件处理程序上设置一个断点,以便在调试器中再次开始跟踪。如果我尝试一行一行地完成代码,那么用户将永远不会获得应用程序的控制权,因为它开始逐步通过空闲例程来代替。查找事件处理程序

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

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

此外,我试过通过资源查看器进行搜索,发现看起来像我想要的按钮,但一直无法找到它。即使我做了,我也不确定这会有什么帮助。不应该有一个很好的简单列表,列出与相关事件一起的图形元素?

我剩下的选择是什么?

回答

0

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

ON_BN_CLICKED(IDC_BUTTONID, OnMyButtonClicked) 

该BN_CLICKED通知地图按钮IDC_BUTTONID的方法OnMyButtonClicked。

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

ON_BN_CLICKED.*IDC_BUTTONID 

这可能是该项目看起来像一个按钮,但实际上不是一个按钮,或者它通过的OnCmdMsg手动路由在这种情况下,你可能会更好寻找点击的症状(即你必须运行一些你知道的代码)在那里放一个休息,然后跟着调用堆栈看看消息是如何处理的。

对于广泛的源代码搜索,我建议寻找一个专门的第三方搜索程序,如Agent RansackWinGrep

2

好的,我会做的第一件事就是你显然已经尝试过了:在资源查看器中查找相关控件的资源ID。如果你有这个ID,你可以在你的类声明中搜索它,在那里会有MFC宏将'click'事件映射到该控件的回调函数。回调当然是你正在寻找的事件处理程序。

所以,如果你无法找到你的眼睛的按钮,搜索它。有一些合理的可能性:

  1. 它在资源文件中,但你不能看到它 - 也许它被其他按钮覆盖;
  2. 它在应用程序中动态命名;
  3. 它是在应用程序中动态创建的。

在您的项目中搜索出现在按钮上的文本 - 匹配大小写,并尝试首先包括引号,如果不成功,则不带引号。您可能必须手动打开并搜索资源文件(关闭资源编辑器并将RC文件作为文本加载到Visual Studio中,然后搜索)。

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

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

此方法可能发生的最糟糕的事情是,按钮上的文本全部出现在项目中,或者该按钮有一个图标并且没有文本。如果你真的很挣扎,你可能会通过使用Spy ++获得关于按钮的信息。您应该能够从中检索数字ID,然后在resource.h中搜索它。

玩得开心!