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?

最佳答案

C union的Pascal等效项称为variant record


  记录类型可以有一个变体部分,看起来像一个案例
  声明。变体部分必须遵循记录中的其他字段
  宣言。
  
  要声明带有变体部分的记录类型,请使用以下命令
  句法:

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

  
  声明的第一部分(最多保留字首)是
  与标准记录类型相同。其余的
  声明-从大小写到可选的最终分号-被调用
  变体部分。在变体部分,
  
  
  标签是可选的,可以是任何有效的标识符。如果您省略标签,也请在其后也省略冒号(:)。
  ordinalType表示序数类型。
  每个constantList是一个表示ordinalType类型的值的常数,或者是此类常数的逗号分隔列表。没有价值可以
  在组合的constantLists中被多次表示。
  每个变体都是用分号分隔的声明列表,类似于fieldList:的主要部分中的类型构造。
  记录类型。也就是说,变体具有以下形式:
  
  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更合适。当然,这很难说,因为与Pascal不同,C没有ByteAnsiChar的单独类型。但是这些数组在我看来就像将它们读为文本一样,因此我猜测AnsiChar更合适。

07-27 14:52