2012-08-09 65 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中搜索它。

玩得開心!