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/)
-   -   WM_COPYDATA sendet nur 62 Bytes (https://www.delphipraxis.net/206908-wm_copydata-sendet-nur-62-bytes.html)

Kostas 8. Feb 2021 15:08

WM_COPYDATA sendet nur 62 Bytes
 
Hallo Zusammen,

ich versuche hiermit einen String zu einer anderen Delphi App zu senden. Der String ist 120 Bytes lang.
Gesendet werden jedoch nur die ersten 62 Bytes. Hat jemand eine Idee warum?


Delphi-Quellcode:
procedure TfrPlantafel.SendData(aImage, aLink, aText: String);
var receiverHandle : THandle;
   copyDataStruct : TCopyDataStruct;
   SendMsgText: String;
begin
 receiverHandle := FindWindow(PChar('TfrSenderApp'),PChar('frSenderApp'));
 SendMsgText := Format('%s;%s;%s',[aLink, aImage, aText]);  //<< SendMsgText ist 120 Bytes lang.

 
 
 if receiverHandle > 0 then
 begin
   copyDataStruct.dwData := Ord(ntSendWhatsAppMsg);
   copyDataStruct.cbData := 1 + Length(SendMsgText);
   copyDataStruct.lpData := PChar(SendMsgText);

   SendMessage(receiverHandle, WM_COPYDATA, LPARAM(Handle), WPARAM(@copyDataStruct)) ;
 end else
 begin
   bsm('Die Sender Anwendung läuft nicht.');
 end;
end;

Gruß Kostas

himitsu 8. Feb 2021 15:16

AW: WM_COPYDATA sendet nur 62 Bytes
 
Zitat:

Delphi-Quellcode:
copyDataStruct.cbData := 1 + Length(SendMsgText);

Wie groß ist seit D2009 ein Char (WideChar) eines String (UnicodeString) ?


Und gerade bei solchen prozessübergreifenden Daten verwendet man NIEMALS "dynamische" DatenFormate (maximal dann, wenn man auch das Format mit übergibt und der Andere das dann auch beachtet)

Also z.B. explizit WideChar (mit PWideChar und WideString bzw. UnicodeString).

Kostas 8. Feb 2021 15:40

AW: WM_COPYDATA sendet nur 62 Bytes
 
Danke für die Antwort.

vermutlich habe ich dich nicht richtig verstanden, ich habe String durch WideString ersetzt und PChar durch PWideChar.
Das hat noch nichts gebracht. Oder meintest du ich soll nicht String sondern ein Array of WideChar verwenden?


Delphi-Quellcode:
procedure TfrPlantafel.SendData(aImage, aLink, aText: String);
var receiverHandle : THandle;
   copyDataStruct : TCopyDataStruct;
   SendMsgText: WideString;
begin
 receiverHandle := FindWindow(PChar('TfrSenderApp'),PChar('frSenderApp'));
 SendMsgText := Format('%s;%s;%s',[aLink, aImage, aText]); //<< SendMsgText ist 120 Bytes lang.

 
 
 if receiverHandle > 0 then
 begin
   copyDataStruct.dwData := Ord(ntSendWhatsAppMsg);
   copyDataStruct.cbData := 1 + Length(SendMsgText);
   copyDataStruct.lpData := PWideChar(SendMsgText);

   SendMessage(receiverHandle, WM_COPYDATA, LPARAM(Handle), WPARAM(@copyDataStruct)) ;
 end else
 begin
   bsm('Die Sender Anwendung läuft nicht.');
 end;
end;

DeddyH 8. Feb 2021 16:04

AW: WM_COPYDATA sendet nur 62 Bytes
 
cbData bezeichnet die Byte-Größe.
Delphi-Quellcode:
copyDataStruct.cbData := 1 + Length(SendMsgText * SizeOf(Char));
[edit]Es müsste wohl eher heißen
Delphi-Quellcode:
copyDataStruct.cbData := (1 + Length(SendMsgText)) * SizeOf(Char);
[/edit]

himitsu 8. Feb 2021 16:09

AW: WM_COPYDATA sendet nur 62 Bytes
 
Wenn das als PChar/PWideChar übertragen wird, dann gehört die abschließende #0 mit dazu
und die ist auch 2 Byte groß.

Delphi-Quellcode:
copyDataStruct.cbData := (Length(SendMsgText) + 1) * SizeOf(WideChar);
copyDataStruct.lpData := PWideChar(SendMsgText);

Kostas 8. Feb 2021 16:13

AW: WM_COPYDATA sendet nur 62 Bytes
 
Herzlichen Dank, genau so funktioniert es.
Jetzt ist auch klar was du meintest. :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:40 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