Einzelnen Beitrag anzeigen

delphifan2004

Registriert seit: 26. Nov 2004
Ort: Dresden
272 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: WM_COPYDATA zwischen Delphi- und Freepascalprogramm

  Alt 13. Feb 2010, 10:46
Hallo Astat!

Danke für den Tipp. So kann natürlich meine erstere Version nicht funktionieren.

Aber ich muss dennoch wieder nachfragen. Ich erhalte nämlich die folgende Fehlermeldung vom FPC Compiler:


server.pas(54,35) Error: Incompatible type for arg no. 1: Got "<procedure variable type of function(LongWord, LongWord, LongInt, LongInt):LongInt;Register>", expected "<procedure variable type of function(LongWord, LongWord, LongInt, LongInt):LongInt;S


Ich habe deshalb den Typ von WProc in den unten stehenden geändert:

Delphi-Quellcode:
var WProc: function (H: hWnd; msg: LongWord; w, l: LongInt): Longint; stdcall;

function NewWndProc(Handle: hWnd; Msg: LongWord; wParam, lParam: Longint): Longint; stdcall;
begin
  if Msg = WM_COPYDATA then begin
    showmessage('Treffer');
  end else
    Result := CallWindowProc(WProc, Handle, Msg, wParam, lParam);
end;
Leider kenne ich mich mit dem Windows API nicht so gut aus.

Wie baue ich die NewWndProc nun in meine Formular ein?

Wenn ich das hier in FormCreate() schreibe:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  WProc := Pointer(SetWindowLong(handle, gwl_WndProc, Integer(@NewWndProc)));
end;

//Deshalb habe ich diese Zeile so hier geändert:

procedure TForm1.FormCreate(Sender: TObject);
begin
  WProc := SetWindowLong(handle, gwl_WndProc, Integer(@NewWndProc));
end;

//da ich ja die Variable WProc in den richtigen Funktionstypen geändert habe
erhalte ich diese Fehlermeldung vom FPC Compiler:

server.pas(60,12) Error: Incompatible types: got "LongInt" expected "<procedure variable type of function(LongWord, LongWord, LongInt, LongInt):LongInt;StdCall>"


WProc ist außerdem eine Nutzerdefinierte Variable.

Nun muss ja aber irgendwo in den Tiefen des Windows API eine Zuweisung der neuen WindowProc stehen.
Welchen Zeiger muss ich da an Stelle von WProc verwenden?

Oder muss ich in der schon definierten WMCopyData() Methode WProc aufrufen?
  Mit Zitat antworten Zitat