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?
答案 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位整数,而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
更合适。当然,这很难说,因为C与Pascal不同,Byte
和AnsiChar
没有单独的类型。但是这些数组看起来好像它们会被视为文本,所以我的猜测是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;