我们最大的一个旧VB6应用程序中有一些代码允许其他应用程序(包括某些dotNET应用程序)通过Windows消息传递一个ID - 然后使用此ID由VB6应用程序以常规的Windows窗体加载条目。消息挂钩在用户登录和验证后添加,并在注销后删除。VB6在使用活动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.如果代码正在调试,并且出现错误以显示“Continue End Debug帮助”对话框,则按下End立即退出Visual Studio(丢失任何未保存的更改)。如果消息挂钩尚未激活,则不会发生这种情况。是什么导致了这种情况,并且我能做些什么来阻止它加载加载该代码的代码?其次,如果用户退出应用程序而没有正确注销(通过任何方式),那么消息挂钩会发生什么?
我希望我有就在上述所有条款...
因此,而不是在我的应用程序的主卸载事件'unhook',我应该监视WM_NCDESTROY在相关的窗口,并在那里调用UnhookClaimFinderCall? – MartW 2009-09-08 20:36:24