Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi IPC mit Unicode Records (https://www.delphipraxis.net/52861-ipc-mit-unicode-records.html)

unfan 5. Sep 2005 17:42


IPC mit Unicode Records
 
Tach zusammen!

Ich stehe vor einem kleinen Problem mit Delphi7.

Ich möchte Daten zwischen zwei lokalen Anwendungen austauschen. Mit WM_COPYDATA ist das ja kein Problem. Da kann man wunderbar Records austauschen.

Delphi-Quellcode:
TRec = packed record
    s: String[50];
  end;
PRec = ^TRec;
Nun bin ich aber in der Situation das ich unter Umständen UNICODE-Strings austauschen muss.
Ich bräuchte am besten eine Form wie

Delphi-Quellcode:
  s: WideString[50];
Sprich: Eine Definition eines WideStrings (Unicode) der 50 Zeichen (nicht 50 bytes enthält). IMHO geht sowas aber nicht. Also versuche ich folgenden Record zu übertragen:

Delphi-Quellcode:
TRec = packed record
    s: PWideString;
  end;
PRec = ^TRec;
Dabei empfängt der Receiver aber nur leere Daten.

Empfänger:
Delphi-Quellcode:
procedure TForm1.WMCOPYDATA(var msg: TWMCopyData);
var
  s: WideString;
begin
  s := WideString(PRec(msg.CopyDataStruct.lpData)^.s);
  Edit1.Text := s;
end;
Sender:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  Rec: PRec;
  cds: TCopyDataStruct;
  hWnd: THandle;
begin
  GetMem(Rec, sizeof(TRec));
  try
    rec.s := PWideString('HALLO!');
    cds.dwData := 0;
    cds.cbData := sizeof(TRec);
    cds.lpData := Rec;
    hWnd := FindWindow(nil, 'Form1');
    SendMessage(hWnd, WM_COPYDATA, Handle, LongInt(@cds));
  finally
    FreeMem(Rec, sizeof(TRec));
  end;
end;
Hat jemand eine Idee wie sowas funktioniert?

Olli 5. Sep 2005 18:05

Re: IPC mit Unicode Records
 
Warum kopierst du nicht als PWideChar? Wenn du WideString oder auch String benutzt, funken dir jede Menge Funktionen dazwischen. String[xyz] ist ja ein Shortstring (per definitionem), aber WideString[xyz] eben nicht.

Daher solltest du lpData folgendes zuweisen:
@DeineWideStringVariable[1]

und dann die Länge in Bytes mitgeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz