Einzelnen Beitrag anzeigen

Cookiemaster

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

Komplexe C-Struct ungleich "packed record" in Delp

  Alt 26. Dez 2005, 22:36
Hallo,

ich hab da ein merkwürdiges Problem mit der Umwandlung von C Structs nach Delphi 7.
Normalerweise übersetzt man die ja zu "packed record", aber das passt trotzdem nicht.
Delphi lässt bei "packed record" keinen Zwischenraum zwischen den Feldern, aber in dem C-Programm (MS Visual C++ 6.0) IST da teilweise ein Zwischenraum!
Siehe Tabelle unten.

Hier die Quellcodes gegenübergestellt. Wenn du Probleme hast den Code zu lesen, dann kopier ihn dir bitte in einen Texteditor damit die automatischen Zeilenumbrüche verschwinden.
Code:
<-------- C-Header ----------------------------->   <-------- Delphi ----------------------------------------->
                                                     const
#define MAX_PATH            260                       MAX_PATH           = 260;
#define AUTORESPEXCLUDE_LEN 5001                      AUTORESPEXCLUDE_LEN = 5001;
#define MAILBOX_LEN         30                        MAILBOX_LEN        = 30;
#define DOMAIN_LEN          45                        DOMAIN_LEN         = 45;
#define EMAIL_LEN  MAILBOX_LEN + DOMAIN_LEN + 1       EMAIL_LEN          = MAILBOX_LEN + DOMAIN_LEN + 1;
#define TIME_LEN            20                        TIME_LEN           = 20;
                                                     type
struct MD_AutoResponder {                              MD_AutoResponder = packed record
  char Script       [MAX_PATH           + 1];         Script        : array[0..MAX_PATH          ] of char;
  char Process      [MAX_PATH           + 1];         Process       : array[0..MAX_PATH          ] of char;
  char Exclude      [AUTORESPEXCLUDE_LEN + 1];         Exclude       : array[0..AUTORESPEXCLUDE_LEN] of char;
  char AddToList    [EMAIL_LEN          + 1];         AddToList     : array[0..EMAIL_LEN         ] of char;
  char RemoveFromList[EMAIL_LEN          + 1];         RemoveFromList : array[0..EMAIL_LEN         ] of char;
  char StartTime    [TIME_LEN           + 1];         StartTime     : array[0..TIME_LEN          ] of char;
  char EndTime      [TIME_LEN           + 1];         EndTime       : array[0..TIME_LEN          ] of char;
  bool PassMessage;                                     PassMessage   : boolean;                            
};                                                    end;


                                                     const
#define FWDADDR_LEN   256                             FWDADDR_LEN  = 256;
#define FWDHOST_LEN   64                              FWDHOST_LEN  = 64;
#define FWDSENDAS_LEN 128                             FWDSENDAS_LEN = 128;
#define FWDPORT_LEN   8                               FWDPORT_LEN  = 8;
                                                     type
struct MD_Forwarding {                                 MD_Forwarding = packed record
     char Address[FWDADDR_LEN  + 1];                   Address : array[0..FWDADDR_LEN ] of char;
     char Host  [FWDHOST_LEN  + 1];                   Host   : array[0..FWDHOST_LEN ] of char;
     char SendAs [FWDSENDAS_LEN + 1];                   SendAs : array[0..FWDSENDAS_LEN] of char;
     char Port  [FWDPORT_LEN  + 1];                   Port   : array[0..FWDPORT_LEN ] of char;
};                                                    end;


                                                     const
#define FULLNAME_LEN    30                            FULLNAME_LEN    = 30;
#define MAILDIR_LEN     90                            MAILDIR_LEN     = 90;
#define PASSWORD_LEN    20                            PASSWORD_LEN    = 20;
#define MBXFORMAT_LEN   32                            MBXFORMAT_LEN   = 32;
#define COMMENT_LEN     512                           COMMENT_LEN     = 512;
#define USERDEFINED_LEN 256                           USERDEFINED_LEN = 256;
                                                     type
struct MD_UserInfo {                                   MD_UserInfo = packed record
     char Email   [EMAIL_LEN   + 1];                  Email   : array[0..EMAIL_LEN  ] of char;
     char Mailbox [MAILBOX_LEN + 1];                  Mailbox : array[0..MAILBOX_LEN ] of char;
     char Domain  [DOMAIN_LEN  + 1];                  Domain  : array[0..DOMAIN_LEN ] of char;
     char FullName [FULLNAME_LEN + 1];                  FullName : array[0..FULLNAME_LEN] of char;
     char MailDir [MAILDIR_LEN + 1];                  MailDir : array[0..MAILDIR_LEN ] of char;
     char Password [PASSWORD_LEN + 1];                  Password : array[0..PASSWORD_LEN] of char;
     bool AutoDecode;                                   AutoDecode         : boolean;
     bool IsForwarding;                                 IsForwarding       : boolean;
     char AccessType;                                   AccessType         : char;
     bool AllowChangeViaEmail;                          AllowChangeViaEmail : boolean;
     bool KeepForwardedMail;                            KeepForwardedMail  : boolean;
     bool HideFromEveryone;                             HideFromEveryone   : boolean;
     bool EncryptMail;                                  EncryptMail        : boolean;
     bool ApplyQuotas;                                  ApplyQuotas        : boolean;
     bool EnableMultiPOP;                               EnableMultiPOP     : boolean;
     bool CanModifyGAB;                                 CanModifyGAB       : boolean;
     long MaxMessageCount;                              MaxMessageCount    : integer;
     long MaxDiskSpace;                                 MaxDiskSpace       : integer;

     int WebConfig;                                    WebConfig          : integer;

     char NTAccount [MAILBOX_LEN  + 1];               NTAccount : array[0..MAILBOX_LEN ] of char;
     char MailFormat [MBXFORMAT_LEN + 1];               MailFormat : array[0..MBXFORMAT_LEN] of char;

     MD_Forwarding   Forwarding;                       Forwarding   : MD_Forwarding;
     MD_AutoResponder AutoResponder;                    AutoResponder : MD_AutoResponder;

     long MaxUIDLCount;                                 MaxUIDLCount  : integer;
     long MaxMessageSize;                               MaxMessageSize : integer;

     bool RecurseIMAP;                                  RecurseIMAP   : boolean;
     bool IsDisabled;                                   IsDisabled    : boolean;
     bool CheckAddrBook;                                CheckAddrBook : boolean;
     bool UpdateAddrBook;                               UpdateAddrBook : boolean;

     int MaxInactive;                                  MaxInactive             : integer;
     int MaxMessageAge;                                MaxMessageAge           : integer;
     int MaxDeletedIMAPMessageAge;                     MaxDeletedIMAPMessageAge : integer;

     char Comments   [COMMENT_LEN    + 1];            Comments   : array[0..COMMENT_LEN   ] of char;
     char UserDefined [USERDEFINED_LEN + 1];            UserDefined : array[0..USERDEFINED_LEN] of char;
};                                                    end;
Hier eine Tabelle mit den Offset-Adressen der einzelnen struct/record-Member:
Code:
:                                             MSVC++6   Delphi
char MD_UserInfo      Email                       0     0
char MD_UserInfo      Mailbox                    77    77
char MD_UserInfo      Domain                    108   108
char MD_UserInfo      FullName                  154   154
char MD_UserInfo      MailDir                   185   185
char MD_UserInfo      Password                  276   276
bool MD_UserInfo      AutoDecode                297   297
bool MD_UserInfo      IsForwarding              298   298
char MD_UserInfo      AccessType                299   299
bool MD_UserInfo      AllowChangeViaEmail       300   300
bool MD_UserInfo      KeepForwardedMail         301   301
bool MD_UserInfo      HideFromEveryone          302   302
bool MD_UserInfo      EncryptMail               303   303
bool MD_UserInfo      ApplyQuotas               304   304
bool MD_UserInfo      EnableMultiPOP            305   305
bool MD_UserInfo      CanModifyGAB              306   306 // bis hier ist alles OK

long MD_UserInfo      MaxMessageCount           308   307 // 1. Fehler um 1 Byte
long MD_UserInfo      MaxDiskSpace              312   311
int  MD_UserInfo      WebConfig                 316   315
char MD_UserInfo      NTAccount                 320   319
char MD_UserInfo      MailFormat                351   350
char MD_Forwarding    Address                   384   383
char MD_Forwarding    Host                      641   640
char MD_Forwarding    SendAs                    706   705
char MD_Forwarding    Port                      835   834
char MD_AutoResponder Script                    844   843
char MD_AutoResponder Process                  1105  1104
char MD_AutoResponder Exclude                  1366  1365
char MD_AutoResponder AddToList                6368  6367
char MD_AutoResponder RemoveFromList           6445  6444
char MD_AutoResponder StartTime                6522  6521
char MD_AutoResponder EndTime                  6543  6542
bool MD_AutoResponder PassMessage              6564  6563

long MD_UserInfo      MaxUIDLCount             6568  6564 // 2. Fehler um weitere 3 Bytes
long MD_UserInfo      MaxMessageSize           6572  6568
bool MD_UserInfo      RecurseIMAP              6576  6572
bool MD_UserInfo      IsDisabled               6577  6573
bool MD_UserInfo      CheckAddrBook            6578  6574
bool MD_UserInfo      UpdateAddrBook           6579  6575
int  MD_UserInfo      MaxInactive              6580  6576
int  MD_UserInfo      MaxMessageAge            6584  6580
int  MD_UserInfo      MaxDeletedIMAPMessageAge 6588  6584
char MD_UserInfo      Comments                 6592  6588
char MD_UserInfo      UserDefined              7105  7101

// Am Schluß stimmt die Objektgröße um ganze 6 Byte nicht!
sizeof(UserInfo)                                 7364  7358
Ich hab mir schon überlegt, ob ich in Delphi "Dummy-Felder" einfügen soll um das Record der Struct anzupassen.
Aber vielleicht gibt es noch eine Einstellungsmöglichkeit, damit der Delphi-Compiler automatisch C-kompatible records erzeugt?
  Mit Zitat antworten Zitat