Einzelnen Beitrag anzeigen

Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

Hook für eigene Windows Message

  Alt 29. Jun 2010, 23:34
Hallo zusammen,

und zwar streite ich mich immer noch mit meinen Threads. Ich habe im Moment einen LogController, der von verschiedenen Threads aus bedient werden kann, d.h. die Log()-Methode steht für diese zur Verfügung. In der Log-Methode wird eine Queue gefüllt und via PostThreadMessage eine Nachricht an den Haupt-Thread geschickt.

Beim Erzeugen des LogControllers (was im HauptThread geschieht -> explizites synchronisiertes Erzeugen) wird ein globaler Hook registriert:
Delphi-Quellcode:
const
  WM_LOG_NOTIFIER = WM_USER + 123;

////////////////////////////////////////////////////////////////////////////////////////////////////
////
//
//
constructor TLogController.Create();
var
  Method: TMethod;
begin
  inherited Create();

  { ... }

  // FHookMethodPointer and FHookHandle are private variables
  Method.Code := @TLogController.HookProc;
  Method.Data := Self;
  FHookMethodPointer := MakeProcInstance(Method);
  FHookHandle := SetWindowsHookEx(WH_GETMESSAGE, FHookMethodPointer, 0, System.MainThreadID);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////
////
//
//
function TLogController.HookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LResult; stdcall;
var
  P: PMsg;
begin
  case nCode < HC_ACTION of
    True:
      Result := CallNextHookEx(FHookHandle, nCode, wParam, lParam);
  else
    if (lParam <> 0) then
    begin
      P := PMsg(lParam);
      if (P^.message = WM_LOG_NOTIFIER) then
        Self.DoPropagateLog();
    end;

    Result := CallNextHookEx(FHookHandle, nCode, wParam, lParam);
  end;
end;
Nun ist es so, dass dieser Hook nicht wirklich auf die Nachricht reagiert, die via PostThreadMessage() versendet wird. Hier noch der Aufruf: PostThreadMessage(System.MainThreadID, WM_LOG_NOTIFIER, 0, 0);

Ich sehe nicht wirklich, warum der Hook nicht auf diese Nachricht reagieren sollte Wobei ich sagen muss, dass ich nicht weiß, ob PMsg der richtige Typ für lParam ist. Ich habe bisher noch nichts passenderes gefunden.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat