2012-04-20 87 views
3

在以下鏈接提到的全球VB6錯誤處理產品聲稱「安裝一個小回調勾入VBE6調試器」:如何實現全局VB6錯誤處理程序?

http://www.everythingaccess.com/simplyvba/globalerrorhandler/howitworks.htm

我想實現這個產品我自己,因爲我想了解更多控制它正在做什麼。上述產品如何實現它的功能?

+3

我們可能能夠在標題中回答問題,但不能回答最後一句中的問題;它太寬泛了。 – 2012-04-20 05:41:53

+1

聽起來有點嚇人。如果處理不正確,VB6中的掛鉤可能會導致IDE崩潰。如果您有一個或多個程序想要自己處理錯誤,會發生什麼情況?這仍然是可能的,或者這個鉤子無例外地竊取所有錯誤嗎? – Martin 2012-04-20 08:07:20

+0

@Martin:這是一個VBA唯一的工具 – wqw 2012-04-20 12:27:03

回答

1

您正在查看的產品是COM組件。從網站上的documentation可以看出,COM組件實現了特定的組件類。如果你已經擁有產品,首先要做的就是啓動SysInternals procmon,在DLL上運行regsvr32,然後根據創建的註冊表項實現哪些組件類。一旦你知道了這一點,MSDN可能會告訴你哪些接口對應於這些組件類。

Microsoft開發了一個名爲Active Scripting的框架,該框架允許您託管腳本引擎並注入調試功能。如果假設VB6產生關係到該框架中的exe文件,你可能能夠做到:

  • 創建一個實現IApplicationDebugger
  • 實施IApplicationDebugger::onHandleBreakPoint能夠在響應錯誤COM組件VB代碼
  • 閱讀MSDN KB Q222966找出如何從onHandleBreakPoint

它回顧了VB調用喜歡的產品注入了ErrEx班使用IActiveScript::AddNamedItem。爲了提供相同的行爲,在同一COM組件上執行IActiveScriptSite::GetItemInfo,以返回一個指向實例(和關聯的TypeInfo)的COM組件,該COM組件實現與ErrEx相同的接口。在您的實現的ErrEx.EnableGlobalErrorHandler你會做到以下幾點:

  • CoCreateInstance INPROC進程調試管理器
  • 演員參考IRemoteDebugApplication
  • 使用IRemoteDebugApplication::ConnectDebugger

註冊您IApplicationDebugger組件的一個實例我掩飾了調用IActiveScript::AddNamedItem,因爲我不知道如何從運行的進程中獲得指向IActiveScript的指針。另外,我不知道創建Process Debug Manager的新實例是否可行,或者您是否需要掛鉤到現有實例中。

我對混亂的解釋道歉,缺少的信息,並粉飾過程的大部分地區,但是這是怎麼回事waaay回來......

你會想讀在MSDN的Active Scripting APIs文章。