如何实现全局的VB6错误处理程序?

3

3
我们可能可以回答你标题中的问题,但无法回答你最后一句话中的问题,因为它太笼统了。 - Robert Harvey
1
对我来说有点吓人。如果没有正确处理,VB6中的钩子可能会导致IDE崩溃。如果您有一个或多个过程,想要自己处理错误,会发生什么?那还是可能的,还是这个钩子窃取了所有错误而没有异常? - Martin
@Martin:这是一个仅限于VBA的工具。 - wqw
不,链接的网站也有VB6内容。我使用过一些工具来装饰你的源代码以支持这种功能,但我不清楚这里使用了什么机制。 - tcarvin
问题中没有提到VBA。标签和内容表明这个问题是关于VB6的。 - Martin
1个回答

1
您正在查看的產品是一個COM元件。從網站上提供的文檔來看,這個COM元件實現了特定的組件類。如果您已經有了這個產品,第一件事情就是啟動SysInternals的procmon,在DLL上運行regsvr32,並通過創建的註冊表項目找出實現的組件類。一旦您知道了這一點,MSDN可能能夠告訴您哪些接口對應於這些組件類。
微軟開發了一個名為Active Scripting的框架,允許您托管腳本引擎並注入調試功能。如果假設VB6生成與該框架相關聯的exe,您可能能夠執行以下操作:
  • 创建一个实现IApplicationDebugger的COM组件
  • 实现IApplicationDebugger::onHandleBreakPoint以便能够响应VB代码中的错误
  • 阅读MSDN KB Q222966,了解如何从onHandleBreakPoint回调到VB

看起来该产品使用IActiveScript::AddNamedItem注入了ErrEx类。为了提供相同的行为,在同一COM组件上实现IActiveScriptSite::GetItemInfo,返回指向实现与ErrEx相同接口的COM组件实例(及其关联的TypeInfo)的指针。在您的ErrEx.EnableGlobalErrorHandler实现中,您需要执行以下操作:

  • CoCreateInstance inproc进程调试管理器
  • 将引用转换为IRemoteDebugApplication
  • 使用IRemoteDebugApplication::ConnectDebugger注册您的IApplicationDebugger组件的实例

我略过了调用IActiveScript::AddNamedItem,因为我不知道如何从运行中的进程获取指向IActiveScript的指针。此外,我不知道创建进程调试管理器的新实例是否有效,或者您是否必须钩入现有实例。

对于混乱的解释、缺失的信息和忽略了大部分过程,我深感抱歉,但这是很久以前的事情了...

您需要阅读MSDN上的Active Scripting APIs文章。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接