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