AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

WM_COPYDATA schreddert strings

Ein Thema von DGL-luke · begonnen am 16. Jul 2006 · letzter Beitrag vom 16. Jul 2006
Antwort Antwort
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#1

WM_COPYDATA schreddert strings

  Alt 16. Jul 2006, 18:37
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...?

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?
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#2

Re: WM_COPYDATA schreddert strings

  Alt 16. Jul 2006, 18:51
Hallo,

wie ist denn dein CpDt.lpData definiert ?
eventuell verschickst Du nur einen Pointer und nicht den String.

Gruss

Thomas
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#3

Re: WM_COPYDATA schreddert strings

  Alt 16. Jul 2006, 18:53
siehe mein edit, es kommt alles an, ich lese nur zu früh.

definiert? CpDt = TCopyDataStruct = tagCOPYDATASTRUCT
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#4

Re: WM_COPYDATA schreddert strings

  Alt 16. Jul 2006, 18:58
Nee,

Integer = 32 bit = 4 byte
handle = integer

also ist der record 8 byte

ich denke das stimmt schon.

Gruss
Thomas
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: WM_COPYDATA schreddert strings

  Alt 16. Jul 2006, 18:58
Hi!

Muß das beim Lesen nicht so aussehen:

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

Gruß Hawkeye
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#6

Re: WM_COPYDATA schreddert strings

  Alt 16. Jul 2006, 19:01
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
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: WM_COPYDATA schreddert strings

  Alt 16. Jul 2006, 20:21
es liegt eindeutig am dereferenzieren.
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)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#8

Re: WM_COPYDATA schreddert strings

  Alt 16. Jul 2006, 20:27
jop, is klar.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:22 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