以下链接中提到的全局 VB6 错误处理程序产品声称“在 VBE6 调试器中安装一个小的回调挂钩”:
http://www.everythingaccess.com/simplyvba/globalerrorhandler/howitworks.htm
我想自己实现这个产品,因为我想更好地控制它在做什么。上述产品如何实现其功能?
以下链接中提到的全局 VB6 错误处理程序产品声称“在 VBE6 调试器中安装一个小的回调挂钩”:
http://www.everythingaccess.com/simplyvba/globalerrorhandler/howitworks.htm
我想自己实现这个产品,因为我想更好地控制它在做什么。上述产品如何实现其功能?
您正在查看的产品是一个 COM 组件。从网站上提供的文档来看,听起来 COM 组件实现了特定的组件类。如果您已经拥有该产品,要做的第一件事是启动 SysInternals procmon
,regsvr32
在 DLL 上运行,并从创建的注册表项中找出实现了哪些组件类。一旦你知道了这一点,MSDN 或许就能告诉你哪些接口对应于那些组件类。
Microsoft 开发了一个名为 Active Scripting 的框架,它允许您托管脚本引擎并注入调试功能。如果假设 VB6 生成一个与该框架相关的 exe,则您可以执行以下操作:
IApplicationDebugger
IApplicationDebugger::onHandleBreakPoint
能够响应 VB 代码中的错误onHandleBreakPoint
看起来该产品ErrEx
使用IActiveScript::AddNamedItem
. 为了提供相同的行为,IActiveScriptSite::GetItemInfo
在同一个 COM 组件上实现以返回一个指针,该指针指向TypeInfo
实现与ErrEx
. 在您的实施中,ErrEx.EnableGlobalErrorHandler
您将执行以下操作:
CoCreateInstance
inproc 进程调试管理器IRemoteDebugApplication
IApplicationDebugger
使用注册组件的实例IRemoteDebugApplication::ConnectDebugger
我忽略了调用IActiveScript::AddNamedItem
,因为我不知道您如何IActiveScript
从正在运行的进程中获取指针。另外,我不知道创建流程调试管理器的新实例是否可行,或者您是否必须以某种方式连接到现有实例。
对于令人困惑的解释、缺失的信息和掩盖大部分过程,我深表歉意,但这又要回来了……
您将需要阅读 MSDN 上的Active Scripting APIs文章。