Einzelnen Beitrag anzeigen

delphifan2004

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

Re: WM_COPYDATA zwischen Delphi- und Freepascalprogramm

  Alt 13. Feb 2010, 00:24
Zitat von Luckie:
Zitat von delphifan2004:
Wenn ich stattdessen den Namen der .exe Datei, ohne Erweiterung, verwende, kommt die Meldung nicht mehr, aber es kommen keine Daten an.
Das kann nicht funktionieren. Du brauchst das Fensterhandle des Zielprogrammes. Kann es sein, dass du ihn falsch geschrieben hast oder so?
Nee, Schreibfehler kann ich keinen entdecken. Das Zielfenster heißt "Server" Das ist es nicht.

Aber ich habe mir die Datenstrukturen PCopyDataStruct und TCopyDataStruct auf der Freepascal Seite selber definiert, weil Freepascal diesen Typ nicht zu kennen scheint. Das Hinzufügen der Units "Windows" und "Messages" bringt mir diesen Datentyp bei Freepascal nicht.

Aber die Datenstruktur muss doch auf jeden Fall so sein, damit ich die Daten aislesen kann?

Verwendet Freepascal da einen Anderen Messagetyp? Wenn ja, wie muss der heißen?
Habe soeben versucht, statt TWMCopyData als Übbergabetyp TMessage für WMCopyData zu verwenden. Bringt aber nicht den gewünschten Erfolg. Habe auch in ReceiveData des Servers eine Methode ConvertMessage aufgerufen, die ich so hier implementiert habe:


In der Methode ReceiveData() hab ich mir dann eine Variable CMsg: TWMCopyData definiert, die mit den
TMessage Daten gefüllt wird und dann auch zum Lesen der Daten verwendet wird.



Delphi-Quellcode:
//Der Freepascal Teil:
type
  {$IFDEF FPC}
  {$ifdef Win32}
  PCopyDataStruct = ^TCopyDataStruct;
  {$EXTERNALSYM tagCOPYDATASTRUCT}
  tagCOPYDATASTRUCT = packed record
    dwData: DWORD;
    cbData: DWORD;
    lpData: Pointer;
  end;
  TCopyDataStruct = tagCOPYDATASTRUCT;

  TWMCopyData = packed record
    Msg: Cardinal;
    From: HWND;
    CopyDataStruct: PCopyDataStruct;
    Result: Longint;
  end;
  {$else}
  PCopyDataStruct = ^TCopyDataStruct;
  tagCOPYDATASTRUCT = packed record

  end;
  TCopyDataStruct = tagCOPYDATASTRUCT;

  TWMCopyData = packed record
  end;
  {$endif}
  {$ENDIF} { von ifdef FPC }


//Wegen des Versuchs in ReceiveData und WMCopyData() TMessage statt TWMCopyData zu testen
function TServer.ConvertMessage(const Msg: TMessage): TWMCopyData;
begin
  move(msg, result, sizeof(TMessage));
end;

//Und hier die geänderte ReceiveData() Methode
function TServer.ReceiveData(var Msg: {$ifdef fpc}TMessage{$else}TWMCopyData{$endif}): String;
var
  sText: array[0..163] of Char;
  CMsg: TWMCopyData;
begin
  // generate text from parameter
  // anzuzeigenden Text aus den Parametern generieren
  {$ifdef FPC}
  CMsg := ConvertMessage(Msg);
  StrLCopy(sText, CMsg.CopyDataStruct^.lpData, CMsg.CopyDataStruct^.cbData);
  //führt aber nicht zum Erfolg, ist wieder auf den alten Stand zurück geändert
  {$else}
  StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
  {$endif}
  // write received text
  // Empfangenen Text ausgeben
  Result := String(sText);
  //pClientShow.Lines.Add(String(sText));
end;



//==========================================================================

Das Delphi Programm, hier als Client:

const
  TARGET_WND = "Server";

procedure TClient.btnSendClick(Sender: TObject);
begin
  Send;
end;

procedure TClient.Send;
var
  aCopyData: TCopyDataStruct;
  hTargetWnd: HWND;
begin
 with aCopyData do
  begin
    dwData := 0;
    cbData := StrLen(PChar(pClientShow.Lines[0])) + 1;
    lpData := PChar(pClientShow.Lines[0]);
  end;
  // Search window by the window title
  // Fenster anhand des Titelzeilentext suchen
  hTargetWnd := FindWindowEx(0, 0, nil, PChar(TARGET_WND));
  if hTargetWnd <> 0 then
    SendMessage(hTargetWnd, WM_COPYDATA, Longint(Handle), Longint(@aCopyData))
  else
    ShowMessage('No Recipient found!');
end;
Kann es sein, das die Berechnung des Handle auf der Freepascal Seite anders erfolgen muss. Die Zeigerarithmetik unterscheidet sich von der in DElphi, soviel ich weiß. Und ich hatte
  Mit Zitat antworten Zitat