Einzelnen Beitrag anzeigen

PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#1

Unicodestring für SendMessage verpacken?

  Alt 13. Aug 2012, 11:01
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?

Geändert von PeterPanino (13. Aug 2012 um 11:05 Uhr) Grund: Tippfehler korrigiert
  Mit Zitat antworten Zitat