Ein Delphi-String besitzt eine Längenangabe (Integer) und braucht daher eigentlich die #0 am Ende nicht.
PChar wird aber ausschließlich durch ein #0 am Stringende begrenzt und wenn man Dieses nicht mit überträgt, dann liest man mit PChar bis zum nächsten #0, welches zufällig irgendwo danach im Arbeitsspeicher liegt und wenn es danach keinen reservierten Speicher mehr gibt, dann gibt es eine Zugriffsverletzung.
Delphi besitzt aber implizit zwei Zeichen mehr im Text, nämlich zwei #0, hinter dem letzten Zeichen im String, welches für die Kompatibilität zum PChar vorhanden ist, damit man den Delphi-String problemlos in einen PChar casten kann.
(#0 ist das Ende eines PChar und #0#0 sind das Ende einer Stringliste aus PChars)
Auslesen bis zum #0.
Delphi-Quellcode:
var
copyDataStruct : TCopyDataStruct;
Nachricht : AnsiString;
begin
copyDataStruct.dwData := ...;
copyDataStruct.cbData := (Length(Nachricht) + 1
{die abschließende #0}) * SizeOf(AnsiChar);
copyDataStruct.lpData := PAnsiChar(Nachricht);
SendMessage(HWND_BROADCAST, WM_COPYDATA, LPARAM(
Handle), WPARAM(@copyDataStruct));
Nachricht := PAnsiChar(Msg.copyDataStruct.lpData);
Auslesen über Längenangabe:
Delphi-Quellcode:
var
copyDataStruct : TCopyDataStruct;
Nachricht : AnsiString;
begin
copyDataStruct.dwData := ...;
copyDataStruct.cbData := Length(Nachricht) * SizeOf(AnsiChar);
copyDataStruct.lpData := PAnsiChar(Nachricht);
SendMessage(HWND_BROADCAST, WM_COPYDATA, LPARAM(
Handle), WPARAM(@copyDataStruct));
SetString(Nachricht, PAnsiChar(Msg.copyDataStruct.lpData), Msg.copyDataStruct.cbData
div SizeOf(AnsiChar));
Oder WideString/UnicodeString mit WideChar und PWideChar.
Oder als UTF8String mit AnsiChar und PAnsiChar.