有一段C语言的结构体声明,不知道如何转换成 Delphi 语句, 请教各位高手.
typedef struct a_backup_db {
    unsigned short  version;
    const char *  output_dir;
    const char *  connectparms;
    const char *  startline;
    MSG_CALLBACK confirmrtn;
    MSG_CALLBACK errorrtn;
    MSG_CALLBACK msgrtn;
    MSG_CALLBACK statusrtn;
    bool backup_database : 1;
    bool backup_logfile : 1;
    bool backup_writefile: 1;
    bool no_confirm : 1;
    bool quiet : 1;
    bool rename_log : 1;
    bool truncate_log : 1;
    bool rename_local_log: 1;
    const char *  hotlog_filename;
}不知道写成下面这样的是否对:
Type   p_Backup_db = ^a_Backup_db;
   a_backup_db = Record
      Version: Word;
      OutPut_dir: Array[0..255] Of Char;
      ConnectParms: Array[0..255] Of Char;
      StartLine: Array[0..255] Of Char;
      ConfirmRtn: uInt;
      ErrorRtn: uInt;
      MsgRtn: uInt;
      StatusRtn: uInt;
      Backup_database: Bool;
      Backup_logfile: Bool;
      Backup_writefile: Bool;
      no_confirm: Bool;
      quiet: Bool;
      rename_log: Bool;
      Truncate_log: Bool;
      rename_local_log: Bool;
      Hotlog_fileName: Array[0..255] Of Char;
   End;

解决方案 »

  1.   

    楼上说得没错,char *为pchar,与Array[0..255] Of Char;是不同的
    另外: delphi中是没有位字段的,你这样定义出来的结构与C的结构大小将不同
    如果要完全兼容性,可将8个bool类定义成一个dword(当然,这个跟编译器有关,在windows下,一般C编译器的缺省对齐方式为4字节,即一个dword),然后用位操作对它们赋值
      

  2.   

    Array[0..255] Of pchar / string
      

  3.   

    MSG_CALLBACK从字面上看,应该是函数指针类型,可用Pointer.没看原定义,不知是否正确.
      

  4.   

    to keiy:请你能不能更详细的说明一下呢. 可以的话请帮忙写一下声明代码. 非常感谢!MSG_CALLBACK 是一个回调地址, 准备不用.
      

  5.   

    MSG_CALLBACK 是一个回调地址, 准备不用.
    ====================================================用不用没关系,如何类型转换是另一回事^_^
      

  6.   

    to maozefa: 
    谢谢指教!上面没有写清楚, C 的声明原型应该是这样的:
    typedef struct a_backup_db {
       unsigned short   version;
       const char *      output_dir;
       const char *      connectparms;
       const char *    startline;
       MSG_CALLBACK      confirmrtn;
       MSG_CALLBACK      errorrtn;
       MSG_CALLBACK      msgrtn;
       MSG_CALLBACK      statusrtn;
       char            backup_database;
       char            backup_logfile;
       char            backup_writefile;
       char            no_confirm;
       char            quiet;
       char            rename_log;
       char            truncate_log;
       char            rename_local_log;
       const char *      hotlog_filename;
    } a_backup_db;
    不知道现在下面这样的声明是否正确?Type
       p_Backup_db = ^a_Backup_db;
       a_backup_db = Record
          Version: Word;
          OutPut_dir: PChar;
          ConnectParms: PChar;
          StartLine: PChar;
          ConfirmRtn: Pointer;
          ErrorRtn: Pointer;
          MsgRtn: Pointer;
          StatusRtn: Pointer;
          Backup_database: uChar;
          Backup_logfile: uChar;
          Backup_writefile: uChar;
          no_confirm: uChar;
          quiet: uChar;
          rename_log: uChar;
          Truncate_log: uChar;
          rename_local_log: uChar;
          Hotlog_fileName: PChar;
       End;
      

  7.   

    调用是这样写的,但是会出现地址错误.大家再帮我看看.谢谢!
       l_Backup.Version := 9;
       l_Backup.Output_Dir:=PChar(ls_TempDir);
       l_Backup.ConnectParms := PChar(ls_ConnectParm);
       l_Backup.StartLine := Nil;
       l_Backup.ConfirmRtn := Nil;
       l_Backup.ErrorRtn := Nil;
       l_Backup.MsgRtn := Nil;
       l_Backup.StatusRtn := Nil;
       l_Backup.Backup_Database := 1;
       l_Backup.Backup_LogFile := 0;
       l_Backup.Backup_WriteFile := 0;
       l_Backup.No_Confirm := 0;
       l_Backup.Quiet := 0;
       l_Backup.Rename_log := 0;
       l_Backup.Truncate_log := 0;
       l_Backup.Rename_local_log := 0;
       l_Backup.hotlog_filename := Nil;
      

  8.   

    文件头interface前面加上
    {$ALIGN ON}
     a_backup_db = Record 改为  a_backup_db = packed Record建议uChar 直接用 Byte