Einzelnen Beitrag anzeigen

peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: FindWindow und WM_COPYDATA

  Alt 18. Jun 2019, 17:15
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.
Peter Below
  Mit Zitat antworten Zitat