Hallo! Ich verwende folgenden Code, um einen string von Programm A nach Programm B zu senden:
Senderprogramm:
Delphi-Quellcode:
type
TCopyDataStruct =
packed record
dwData: DWORD;
cbData: DWORD;
lpData: Pointer;
end;
private
procedure SendString(
const stringToSend:
string;
const ReceiverHandle: HWND);
implementation
procedure TformSender.SendString(
const stringToSend:
string;
const ReceiverHandle: HWND);
var
copyDataStruct: TCopyDataStruct;
begin
copyDataStruct.dwData := 0;
copyDataStruct.cbData := 1 + (Length(stringToSend) * 2);
// ?
copyDataStruct.lpData := PWideChar(stringToSend);
SendMessage(ReceiverHandle, WM_COPYDATA, Integer(
Handle), Integer(@copyDataStruct));
end;
procedure TformSender.Button1Click(Sender: TObject);
var
EmpfaengerHandle: HWND;
begin
EmpfaengerHandle := FindWindow(PWideChar('
TformEmpfaenger'), PWideChar('
Empfängerprogramm'));
if EmpfaengerHandle <> 0
then
SendString('
Meine Nachricht', EmpfaengerHandle);
end;
Empfängerprogramm:
Delphi-Quellcode:
type
TWMCopyData = packed record
Msg: Cardinal;
From: HWND;
CopyDataStruct: PCopyDataStruct;
Result: Longint;
end;
private
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
implementation
procedure TformEmpfaenger.WMCopyData(var Msg: TWMCopyData);
var
s: string;
begin
s := PWideChar(Msg.CopyDataStruct.lpData);
MessageDlg('"' + s + '"', mtInformation, [mbOK], 0);
Msg.Result := 6666;
end;
Das funktioniert auf meinem Computer auch sehr gut. ABER: Ich habe im Senderprogramm die Länge des strings so angegeben:
1 + (Length(stringToSend) * 2),
weil der string mit PWideChar ja in einen
Unicode-string verpackt wird, und ich annehme (räusper), dass bei
Unicode jedes Zeichen 2 Bytes enthält - deshalb der Multiplikator
2. Wenn ich den Multiplikator nicht verwende, kommt beim Empfänger teilweise Zeichensalat heraus.
ABER es könnte ja sein, dass auf einem anderen Computer mit einem anderen Windows-Betriebssystem die Byte-Länge für ein Zeichen anders ist. Würde dieses Programm dann dort auch funktionieren?