Da ich nicht sicher war in welches UnterForum mein Problem gehört:
Ich würde gerne mit SendMessage und WW_COPYDATA einen einfachen String zwischen einem Delphi-3 Programm und einem Delphi-10-Programm senden.
In D3 zu arbeiten ist hier leider nicht optional, aber auch (hoffentlich) nicht das Problem.
Um das nicht in den Hauptprogrammen zu testen habe ich mit dazu flott zwei neue Programme erstellt, mit folgendem Code:
Siehe Änderungen im Code:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
aCopyData: TCopyDataStruct;
hTargetWnd: HWND;
s:
string;
begin
s:='
test';
with aCopyData
do
begin
// tell receiver the size of a char!
dwData := sizeof(char);
// Nicht Unicode-kompatibel!!
// cbData := StrLen(PChar(s)) + 1;
cbData := (Length(s)+ 1)*Sizeof(char);
lpData := PChar(s)
end;
hTargetWnd:=FindWindow(
nil,'
test');
htargetWnd:=strtoint(Edit1.Text);
//weil findwindow nicht das richtige liefert
if hTargetWnd <> 0
then
SendMessage(hTargetWnd, WM_COPYDATA, Longint(
Handle), Longint(@aCopyData))
else
ShowMessage('
No Recipient found!');
end;
Delphi-Quellcode:
procedure TForm1.WMCopyData(var Msg: TWmCopyData);
procedure UnsupportedCharsize;
begin
assert(false, 'Unsupported character size');
end;
var
s: string;
begin
case sizeof(char) of
1: begin
// target is ansistring
if msg.dwdata = 1 then
s:= PChar(msg.lpdata)
else if msg.dwdata = 2 then
s:= widecharToString(pwidechar(msg.lpdata))
else
UnsupportedCharsize;
end;
2: begin
// target is unicodestring
if msg.dwdata = 2 then
s:= PChar(msg.lpdata)
else if msg.dwdata = 1 then
s:= String(Ansistring(pansichar(msg.lpdata)))
else
UnsupportedCharsize;
end;
else
UnsupportedCharsize;
end;
label1.Caption := s;
end;
Ungetestet!
Dein Problem mit FindWindow ist einfach, dass deine Parameter zu unspezifisch sind. Versuch mal,anstelle von nil für den Klassennamen wirklich den Namen der Formklasse zu verwenden. Der sollte dann aber nicht gerade TForm1 sein
, Du brauchst was eindeutiges.