如何将C联合翻译成Delphi?

时间:2012-11-10 17:33:36

标签: delphi

typedef struct _FILE_OBJECTID_INFORMATION {
    LONGLONG FileReference;
    UCHAR ObjectId[16];
    union {
        struct {
            UCHAR BirthVolumeId[16];
            UCHAR BirthObjectId[16];
            UCHAR DomainId[16];
        } DUMMYSTRUCTNAME;
        UCHAR ExtendedInfo[48];
    } DUMMYUNIONNAME;
} FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION;

如何将这样的联盟翻译成Delphi?

2 个答案:

答案 0 :(得分:21)

C union的Pascal等价物称为variant record

  

记录类型可以包含变体部分,看起来像 case   声明。变体部分必须遵循记录中的其他字段   声明。

     

要声明具有变体部分的记录类型,请使用以下命令   语法:

type recordTypeName = record
  fieldList1: type1;
   ...
  fieldListn: typen;
case tag: ordinalType of
  constantList1: (variant1);
   ...
  constantListn: (variantn);
end;
     

声明的第一部分 - 保留字 case - 是   与标准记录类型相同。其余部分   声明 - 从 case 到可选的最终分号 - 被调用   变体部分。在变体部分,

     
      
  • 标记是可选的,可以是任何有效的标识符。如果省略标记,则在其后面省略冒号(:)。
  •   
  • ordinalType 表示序数类型。
  •   
  • 每个 constantList 是一个常量,表示类型为 ordinalType 的值,或者是这些常量的逗号分隔列表。没有价值可以   在合并的 constantLists 中多次出现。
  •   
  • 每个变体是一个以分号分隔的声明列表,类似于 fieldList:type 结构中的主要部分   记录类型。也就是说,变体具有以下形式:

         

    fieldList1:type1;    ...   fieldListn:typen;

  •   
     

其中每个 fieldList 是有效的标识符或逗号分隔的列表   标识符,每种类型表示一种类型,最后一个分号是   可选的。类型不能是长字符串,动态数组,变体   (即Variant类型)或接口,也不能构造它们   包含长字符串,动态数组,变体或的类型   接口;但它们可以指向这些类型。

     

变体部分的记录在语法上很复杂但是   看似简单的语义。记录的变体部分包含   几种在内存中共享相同空间的变体。你可以阅读或   随时写入任何变体的任何字段;但如果你写一个   你可以在一个变体中的字段然后在另一个变体中的字段中   覆盖自己的数据。标签,如果有的话,用作   一个额外的字段(类型为 ordinalType )在非变体部分   记录。


至于其余部分,这是非常常规的:LONGLONG是一个64位整数,而UCHARunsigned char,或者是Delphi中的AnsiChar

type
  TFileObjectIDInformation = record
    FileReference: Int64;
    ObjectID: array[0..15] of AnsiChar;
    case Integer of
    0:
      (
        BirthVolumeId: array[0..15] of AnsiChar;
        BirthObjectId: array[0..15] of AnsiChar;
        DomainId: array[0..15] of AnsiChar;
      );
    1:
      (ExtendedInfo: array[0..47] of AnsiChar);
  end;

Byte可能比AnsiChar更合适。当然,这很难说,因为C与Pascal不同,ByteAnsiChar没有单独的类型。但是这些数组看起来好像它们会被视为文本,所以我的猜测是AnsiChar更合适。

答案 1 :(得分:4)

类似的结构可以在JEDI API Lib中找到:

  _FILE_OBJECTID_BUFFER = record

    //
    //  This is the portion of the object id that is indexed.
    //

    ObjectId: array [0..15] of BYTE;

    //
    //  This portion of the object id is not indexed, it's just
    //  some metadata for the user's benefit.
    //

    case Integer of
      0: (
        BirthVolumeId: array [0..15] of BYTE;
        BirthObjectId: array [0..15] of BYTE;
        DomainId: array [0..15] of BYTE);
      1: (
        ExtendedInfo: array [0..47] of BYTE);
  end;