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

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

问题描述:

在以下链接提到的全球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

您正在查看的产品是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文章。