2009-09-08 5 views
2

가장 오래된 VB6 앱 중 하나에 다른 프로그램 (일부 dotNET 사용자 포함)이 Windows 메시지를 통해 ID를 전달할 수있는 코드가 있습니다.이 ID는 다음에 사용됩니다 VB6 응용 프로그램에서 일반 Windows 양식으로 항목을로드합니다. 사용자가 로그인하여 인증 한 후에 메시지 후크가 추가되고 로그 아웃되면 제거됩니다.활성 Windows 메시지 후크로 디버깅하는 동안 VB6 종료

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가 종료됩니다 (저장되지 않은 변경 내용은 손실됩니다). 메시지 후크가 아직 활성화되지 않은 경우에는 발생하지 않습니다. 무엇이이 문제를 일으키고, 후크를로드하는 코드를 주석 처리하지 못하게하기 위해 할 수있는 일이 있습니까?

둘째, 사용자가 로그 아웃하지 않고 앱을 종료하면 (어떤 방법 으로든) 메시지 훅은 어떻게됩니까? 내가 바로 위의 모든 조건을 가지고 희망

...

답변

5
  1. 당신은 충돌 (또는 VB6 사라지는)는 글로벌 후크와 VB6에서 디버깅하는 시도를 시작하면 얻을 것입니다. VB6는 시뮬레이터와 비슷하지만 VB6 애플리케이션의 런타임을 정확히 복제하지 못하고 후킹은 비참하게 실패하는 영역 중 하나입니다.하지만 실제로 발생하는 상황을 이해하면 비난받을 수는 없습니다. 우리가 우리의 응용 프로그램에서 사용하는 모든 전역 후크에 대해 VB6이 IDE 모드에서 실행 중인지 확인합니다 (여러 가지 방법이 있습니다). 그렇다면 전역 후크를 실행하지 마십시오. 전역 훅을 절대적으로 실행해야하는 경우 디버거에서 응용 프로그램을 중지하지 마십시오. debug.print 또는 다른 방법을 사용합니다. 그러나 응용 프로그램을 중지하지 마십시오. 응용 프로그램을 중지하지 않으면 밀리 초에서 초가됩니다.
  2. 응용 프로그램을 종료하기 전에 언 Hook해야하지만, 메시지 펌프가 후크에 부딪 치고 후크가 더 이상 존재하지 않는 응용 프로그램의 핸들이 더 이상 존재하지 않으면, 그 후크를 무시하는 것은 상당히 지루한 작업입니다. 이제 응용 프로그램을 실행하고 수천 회 종료하면 아마도 구축 될 것입니다.하지만 생각한 것 중 가장 적은 것입니다.
3

크리스의 대답은 정확합니다. 몇 가지 추가 사항.

  • 엄밀히 말하면 메시지 후킹이 아니라 서브 클래 싱입니다.
  • WindProc에서 WM_NCDESTROY를 감지하고 해당 메시지를 받으면 푸시하지 않는 것이 좋습니다. 이 메시지는 창을 파손하려한다는 것을 의미합니다. 사용자가 앱을 종료하는 경우 아무리 좋아도 종료해야합니다.
  • Windows 2000 이상에서 서브 클래 싱을보다 쉽게 ​​관리 할 수있는 몇 가지 API 호출이 있습니다. 항상 그렇듯이 Karl Peterson은 우수한 VB6 코드 here을 가진 우수 기사를 보유하고 있습니다.
+0

내 앱의 기본 언로드 이벤트에서 '언 후크'대신 관련 윈도우에서 WM_NCDESTROY를 모니터링하고 UnhookClaimFinderCall을 호출해야합니까? – MartW

관련 문제