Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#2

Re: Problem beim Senden eines Records mit CopyDataStruct

  Alt 24. Nov 2007, 02:23
WM_COPYDATA kopiert nur das, wohin lpData in deiner Applikation zeigt in der Größe, wie es cbData angibt. Dein Record enthält aber Strings und die haben eine Variable länge und werden dort nur als Adresse (in deinem lokalen Speicher) abgelegt. Somit versendest du nur 4 Adressen welche in deiner Applikation gültig sind, aber beim Empfänger selber steht dort Müll (wenn überhaupt). Du versendest also nicht die Daten selber, sondern nur Pointer. Du kannst ja mal überprüfen was SizeOf() dir für den Record ausgibt, der Debugger dürfte dir da auch nur mickrige 20 Bytes ausgeben - und das ist für 4 Strings und ein Handle eindeutig zu wenig. Das wäre aber mal eine wirklich gute Kompression, weil diese Grösse ändert sich nicht, egal wieviel zu zuweist. Ein Record hat die Eigenschaft zur Laufzeit eine konstante Grösse zu haben.

Abhilfe: Lege entweder eine definierte variable Struktur im Speicher an, wo die Strings nacheinander folgen und du sie auch sicher wieder trennen kannst. Diesen kompletten Speicherbereich kannst du dann versenden. Das wird dann aber nicht mit einerm Record funktioniert, da dieser - wie schon gesagt - konstant ist. Andere Möglichkeit: beschränke dich auf eine maximale Stringlänge. Dann definiere diese als die Grösse der Strings und sie würden auch an Ort und Stelle in dem Record liegen. Gutes Beispiel für ein 255 Zeichenstring wäre der ShortString. Für die letzte Methode bräuchtest du nur die Record-Definition ändern und string durch ShortString ersetzen. Damit wird dann dein Record ungemein grösser (siehe SizeOf()), aber auch die Strings dürfen nur noch maximal 255 Zeichen enthalten.

/EDIT: In deinem Tutorial wird auch ein String[255] genutzt (entspricht genau dem ShortString) und darin liegt der Grund.
  Mit Zitat antworten Zitat