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 WM_COPYDATA schreddert strings (https://www.delphipraxis.net/73354-wm_copydata-schreddert-strings.html)

DGL-luke 16. Jul 2006 18:37


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:
//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));
Lesen:

Delphi-Quellcode:
//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));
Dabei wird aus "abcde" "s´Ñw0 ".

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:
type
  TLogInfo = record
    YourHandle: hWnd;
    LogIdentifier: Integer;
  end;
Ist 8 nicht ein normaler Pointer?! sollte der record nicht 32 bit haben?

thkerkmann 16. Jul 2006 18:51

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

DGL-luke 16. Jul 2006 18:53

Re: WM_COPYDATA schreddert strings
 
siehe mein edit, es kommt alles an, ich lese nur zu früh.

definiert? CpDt = TCopyDataStruct = tagCOPYDATASTRUCT

thkerkmann 16. Jul 2006 18:58

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

Hawkeye219 16. Jul 2006 18:58

Re: WM_COPYDATA schreddert strings
 
Hi!

Muß das beim Lesen nicht so aussehen:

Delphi-Quellcode:
MS.Write(Msg.CopyDataStruct.lpData^, Msg.CopyDataStruct.cbData);
Du möchtest sicher die Daten verarbeiten, auf die lpData zeigt.

Gruß Hawkeye

DGL-luke 16. Jul 2006 19:01

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:

SirThornberry 16. Jul 2006 20:21

Re: WM_COPYDATA schreddert strings
 
es liegt eindeutig am dereferenzieren.
Delphi-Quellcode:
MS.Write(Msg.CopyDataStruct.lpData,Msg.CopyDataStruct.cbData);
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)

DGL-luke 16. Jul 2006 20:27

Re: WM_COPYDATA schreddert strings
 
jop, is klar.


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