3

以下链接中提到的全局 VB6 错误处理程序产品声称“在 VBE6 调试器中安装一个小的回调挂钩”:

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

我想自己实现这个产品,因为我想更好地控制它在做什么。上述产品如何实现其功能?

4

1 回答 1

1

您正在查看的产品是一个 COM 组件。从网站上提供的文档来看,听起来 COM 组件实现了特定的组件类。如果您已经拥有该产品,要做的第一件事是启动 SysInternals procmonregsvr32在 DLL 上运行,并从创建的注册表项中找出实现了哪些组件类。一旦你知道了这一点,MSDN 或许就能告诉你哪些接口对应于那些组件类。

Microsoft 开发了一个名为 Active Scripting 的框架,它允许您托管脚本引擎并注入调试功能。如果假设 VB6 生成一个与该框架相关的 exe,则您可以执行以下操作:

  • 创建一个实现的 COM 组件IApplicationDebugger
  • 实现IApplicationDebugger::onHandleBreakPoint能够响应 VB 代码中的错误
  • 阅读 MSDN KB Q222966以了解如何从onHandleBreakPoint

看起来该产品ErrEx使用IActiveScript::AddNamedItem. 为了提供相同的行为,IActiveScriptSite::GetItemInfo在同一个 COM 组件上实现以返回一个指针,该指针指向TypeInfo实现与ErrEx. 在您的实施中,ErrEx.EnableGlobalErrorHandler您将执行以下操作:

  • CoCreateInstanceinproc 进程调试管理器
  • 投射参考IRemoteDebugApplication
  • IApplicationDebugger使用注册组件的实例IRemoteDebugApplication::ConnectDebugger

我忽略了调用IActiveScript::AddNamedItem,因为我不知道您如何IActiveScript从正在运行的进程中获取指针。另外,我不知道创建流程调试管理器的新实例是否可行,或者您是否必须以某种方式连接到现有实例。

对于令人困惑的解释、缺失的信息和掩盖大部分过程,我深表歉意,但这又要回来了……

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

于 2012-05-03T09:07:55.787 回答