gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:55:49 27 4
gpt4 key购买 nike

我们最大的一个旧 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com