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位整数,而UCHAR
是unsigned 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没有Byte
和AnsiChar
的单独类型。但是这些数组在我看来就像将它们读为文本一样,因此我猜测AnsiChar
更合适。