winapi - VB6 在使用事件 Windows 消息 Hook 进行调试时退出

标签 winapi vb6 hook message

我们最大的一个旧 VB6 应用程序中有一些代码允许其他应用程序(包括一些 dotNET 应用程序)通过 Windows 消息将 ID 传递给它 - 然后 VB6 应用程序使用该 ID 来加载条目一个常规的 Windows 窗体。消息 Hook 在用户登录并通过身份验证后添加,并在用户注销后删除。

Public Sub HookClaimFinderCall()
    lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)
End Sub

Public Sub UnhookClaimFinderCall()
    Dim temp As Long
    If gHW <> 0 Then temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
End Sub

Private Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If uMsg = WM_FINDCLAIM Then
        MasterFindClaim lParam
    End If
    WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Function

但是,这有两个问题。第一个与 Visual Studio 6 相关。如果正在调试代码,并且出现错误以调出“继续结束调试帮助”对话框,则按 End 会立即退出 Visual Studio(丢失所有未保存的更改)。如果尚未激活消息 Hook ,则不会发生这种情况。是什么原因造成的,除了注释掉加载钩子(Hook)的代码之外,我能做些什么来阻止它?

其次,如果用户在未正确注销的情况下(通过任何方式)退出应用,消息 Hook 会发生什么情况?

我希望上面的所有条款都正确...

最佳答案

  1. 如果您启动全局 Hook 并尝试在 VB6 中调试,您将会崩溃(或消失 VB6)。 VB6 有点像模拟器,它并没有完全复制 VB6 应用程序的运行时,并且 Hook 是它惨遭失败的领域之一(尽管如果您了解正在发生的事情,也不能真正责怪它)。对于我们在应用程序中使用的所有全局 Hook ,我们检查 VB6 是否在 IDE 模式下运行(有几种方法可以做到这一点),如果是,请不要运行全局 Hook 。如果您绝对必须运行全局 Hook ,请不要在调试器中停止应用程序 - 使用 debug.print 或其他方式,但不要停止应用程序,否则您将在它“消失”之前有几毫秒到几秒的时间。
  2. 虽然您应该在退出应用程序之前取消钩子(Hook),但当消息泵命中钩子(Hook)并且发生钩子(Hook)的应用程序句柄不再存在时,忽略该钩子(Hook)是相当便宜的操作。现在,如果您运行应用程序并退出数千次,它可能会累积,但我认为这是您最不关心的问题。

关于winapi - VB6 在使用事件 Windows 消息 Hook 进行调试时退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1394261/

相关文章:

c++ - 从 Win32 项目中的 *.bmp 文件加载 HBITMAP

c++ - 如何获取进程相对时间

visual-studio - 如何将 UAC 集成到我的 VB6 程序中?

dom - 使用 InternetExplorer.Application 对象检查网页上的复选框

excel - 源代码属性 VB_VarMemberFlags 在 VBA 中起什么作用(如果有的话)?

css - 在 WordPress 上的 TinyMCE iframe 的 <head> 标签中注入(inject)代码

java - 使用 JNA (Java) 进行 Windows 缩略图预览

internet-explorer - IWebBrowser2 Ctrl+C等快捷键支持

c - GetProcAddress 返回 NULL

winapi - 将 DBG 转换为 PDB?