Einzelnen Beitrag anzeigen

Cookiemaster

Registriert seit: 26. Dez 2005
7 Beiträge
 
#4

Re: Komplexe C-Struct ungleich "packed record" in

  Alt 27. Dez 2005, 22:15
Zitat von Robert Marquardt:
Versuch mal das Alignmment mit {$ALIGN 4} zu setzen und packed zu entfernen.
Bis einschliesslich CanModifyGAB sind es alles Variablen mit Groesse 1 so dass der Compiler sie dicht an dicht legen kann. Beim Bytezugriff ist das Alignment egal.
Erst bei MaxMessageCount beginnt das Alignment zu wirken. Es sollte uebrigens besser Longint sein.
Der naechste Alignmentunterschied zeigt ganz genau das es ein Alignment auf 4 ist, denn es werden 3 Bytes ergaenzt.
Das ist das erste mal, dass ich in Delphi eine DLL & C-Struct verwende und ich hab mich natürlich informiert wie das geht - DLL Funktionen importieren, Structs in Records umwandeln... und AFAIK stand da immer man soll "packed record" verwenden.
Das C++ Projekt ist so eingestellt: "Struct-Element-Ausrichtung" = 8 Byte.
Jedenfalls geht es jetzt ohne das packed und mit {$ALIGN 8}.
Vielen Dank!

Zitat von Der Jan:
OT-Frage Womit hast du das Listing der Offsets erstellt? Oder war es Handarbeit ?
Ich hab www.ultraedit.com benutzt (Spaltenbearbeitung und Makros sind damit möglich) um das zu erzeugen:
Code:
Mainform.log.Lines.Add('@UserInfo.Email  = ' + inttostr( integer(@UserInfo.Email  ) - integer(@UserInfo) ) );
Mainform.log.Lines.Add('@UserInfo.Mailbox = ' + inttostr( integer(@UserInfo.Mailbox ) - integer(@UserInfo) ) );
Mainform.log.Lines.Add('@UserInfo.Domain = ' + inttostr( integer(@UserInfo.Domain ) - integer(@UserInfo) ) );
  Mit Zitat antworten Zitat