我们最大的一个旧的vb6应用程序中有一些代码,允许其他应用程序(包括一些dotnet应用程序)通过Windows消息向其传递ID-然后vb6应用程序使用此ID加载常规Windows窗体中的条目。消息钩子是在用户登录和验证之后添加的,并在用户注销后删除。
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有关。如果正在调试代码,并且在弹出“继续结束调试帮助”对话框时出错,则按“结束”立即退出Visual Studio(丢失所有未保存的更改)。如果消息挂钩尚未激活,则不会发生这种情况。是什么导致了这种情况,除了注释掉加载钩子的代码,我还能做些什么来阻止它呢?
其次,如果用户不正确地退出应用程序(无论以何种方式),那么消息挂钩会发生什么情况?
我希望我已经掌握了上面所有的条件…