![]() |
AW: Probleme mit WM_CopyData
Bedenke auch das eine WM_COPYDATA im eigenen Programm zur Kommunikation Programmintern nicht funktioniert bzw. zufällig funktioniert wenn NView installiert ist. Dieser Hook WM_COPYDATA-Events und reicht sie nicht mehr weiter wenn das Event nicht zwischen Prozessen verwendet wird.
|
AW: Probleme mit WM_CopyData
Wobei PAnsiChar kein sooo schlechter Rat war.
Aber ich würde da eher auf PWideChar gehn. Also WideString/UnicodeString, SizeOf(WideChar) und PWideChar. Denn wenn man jetzt ein altes Ansi-Programm mit einem neuen Unicode-Programm reden läßt, dann kommt wieder nur Müll raus. Beim Abspeichern und beim Datenübertragen niemals dynamisch Typen ala Integer, NativeInt, Pointer, String, PChar und Char verwenden (außer man speichert die Größe mit ab), denn dabei kann man schnell Probleme bekommen, wenn sich diese Typen mal ändern. (siehe "früher ging es mal") PS: Auch aufpassen, wen die beiden Programme mit unterschiedlichen Rechten arbeiten. Ein Programm im Benutzerkontekt kann einem Programm mit höheren Rechten (Admin) keine Messages schicken. |
AW: Probleme mit WM_CopyData
Sender- und Empfänger-Programm sind ja wohl laut Ausgangspost beide vom TE. Solange er also in beiden die selben Typen (und dieselbe Delphi-Version) benutzt, sollte es bezüglich Ansi oder Unicode keine Probleme geben.
|
AW: Probleme mit WM_CopyData
Mir ist auch grade aufgefallen, daß hier Pointer nach LongInt (32-Bit) gecastet werden.
Da kann es in einem 64 Bit-Programm natürlich auch wunderbar knallen. In Win64 sind zwar viele Handle immernoch 32 Bit, auch wenn der Typ 64 Bit ist, als Tribut an die IPC zu 32 Bit, aber Zeiger aus dem Delphi-Speichermanager sind da natürlich nicht begrenzt, außer es wird explizit so verlangt. PS: Für SendMessage gibt es auch extra die zugehörigen Typen, also WPARAM, LPARAM und LRESULT. |
AW: Probleme mit WM_CopyData
Bei unterschiedlichen Prozessen ist die Adresse nur so lange gültig, bis die Nachricht verarbeitet wurde.
An dieser Stelle muss ein neuer String mit einer Kopie der Zeichenkette angelegt werden:
Delphi-Quellcode:
Der zusätzlichen Cast auf String ist ungültig, denn lpData verweist nur auf einen Puffer mit einer 0-terminierten Zeichenkette.
..
s := PChar(Msg.CopyDataStruct.lpData); .. Bei einem String liegt ein Teil der Daten (z.B. Referenzzähler) vor dieser Adresse. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz