![]() |
WM_COPYDATA schreddert strings
Hallo, ich verschicke feste Daten (in einem record) und einen zusätzlichen string, der hinten dran kommt, per WM_COPYDATA.
Schreiben:
Delphi-Quellcode:
Lesen:
//xx//
LI.YourHandle := Handle; LI.LogIdentifier := LogIndex; s := ELog.Text + #13#10; ms := TMemoryStream.Create; ms.Write(LI,sizeof(TLogInfo)); ms.Write(s[1],length(s)); CpDt.dwData := Integer(ltWrite); CpDt.cbData := ms.Size; CpDt.lpData := ms.Memory; SendMessage(LogHandle,WM_COPYDATA,Handle,Integer(@CpDt));
Delphi-Quellcode:
Dabei wird aus "abcde" "s´Ñw0 ".
//xx//
MS := TMemoryStream.Create; MS.Write(Msg.CopyDataStruct.lpData,Msg.CopyDataStruct.cbData); MS.Position := sizeof(LIReceived); setlength(AddedString,MS.Size - MS.Position); MS.Read(AddedString[1],length(AddedString)); was mache ich falsch...? :gruebel: EDIT: ich fange offenbar zu früh mit dem Lesen an.... ein längerer string wird teilweise übernommen. sizeof(TLogInfo) gibt 8 zurück. Deklaration sieht aber so aus:
Delphi-Quellcode:
Ist 8 nicht ein normaler Pointer?! sollte der record nicht 32 bit haben?
type
TLogInfo = record YourHandle: hWnd; LogIdentifier: Integer; end; |
Re: WM_COPYDATA schreddert strings
Hallo,
wie ist denn dein CpDt.lpData definiert ? eventuell verschickst Du nur einen Pointer und nicht den String. Gruss Thomas |
Re: WM_COPYDATA schreddert strings
siehe mein edit, es kommt alles an, ich lese nur zu früh.
definiert? CpDt = TCopyDataStruct = tagCOPYDATASTRUCT |
Re: WM_COPYDATA schreddert strings
Nee,
Integer = 32 bit = 4 byte handle = integer also ist der record 8 byte ich denke das stimmt schon. Gruss Thomas |
Re: WM_COPYDATA schreddert strings
Hi!
Muß das beim Lesen nicht so aussehen:
Delphi-Quellcode:
Du möchtest sicher die Daten verarbeiten, auf die lpData zeigt.
MS.Write(Msg.CopyDataStruct.lpData^, Msg.CopyDataStruct.cbData);
Gruß Hawkeye |
Re: WM_COPYDATA schreddert strings
hmm... das kann natürlich sein... aber ich hätte angenommen, das macht der memorystream selber.
Ich sags nochmal: es kommt alles(!) an! EDIT: OK... anscheinend stimmt das doch mit dem dereferenzieren... ich hab jetzt nur noch ein paar Leerzeichen davor... EDIT2: Die deklarier ich als Feature. :) Danke für die Hilfe, dass ich das dereferenzieren muss, da wär ich wohl nie draufgekommen :thumb: |
Re: WM_COPYDATA schreddert strings
es liegt eindeutig am dereferenzieren.
Delphi-Quellcode:
der erste Parameter von "Stream.Write" ist nämlich kein Pointer sondern eine untypisierte Referenz. Du schreibst also mit obigen Befehl deinen Pointer in den Stream und die Daten die hinter dem Pointer im speicher liegen (was anscheinend zufällig dein String ist). Wie du schon festgestellt hast musst du also lpData dereferenzieren denn wie schon geschriebne erwartet Stream.Write keinen Pointer auf die Daten, sondern die Daten selbst (was in obigem Teil dein Pointer wäre, wo du aber als länge nicht SizeOf(Pointer) angibst sondern eine falsche Länge)
MS.Write(Msg.CopyDataStruct.lpData,Msg.CopyDataStruct.cbData);
|
Re: WM_COPYDATA schreddert strings
jop, is klar.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:28 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