我正在使用Windows API,并且必须在Delphi record中重新创建a structure。我想我已经记下来了,但是这个有点混乱,我需要确保我做得正确。
以下是原始的C++结构:
typedef struct RETRIEVAL_POINTERS_BUFFER {
DWORD ExtentCount;
LARGE_INTEGER StartingVcn;
struct {
LARGE_INTEGER NextVcn;
LARGE_INTEGER Lcn;
} Extents[1];
} RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER;请注意,此结构中有一个数组结构。这就是我迷路的地方。如果我没记错的话,Delphi版本应该是这样的:
TExtent = record
NextVcn: Integer;
Lcn: Integer;
end;
TExtents = array of TExtent;
PRETRIEVAL_POINTERS_BUFFER = ^TRETRIEVAL_POINTERS_BUFFER;
TRETRIEVAL_POINTERS_BUFFER = record
ExtentCount: DWORD;
StartingVcn: Integer;
Extents: TExtents;
end;当我在Windows API中使用此结构时,它似乎确实起作用了。但是,由于结构中的这个结构数组,我有点犹豫我这样做是否正确。这样看起来对吗?
发布于 2012-10-07 04:46:10
Extents字段是一个内联在结构中的可变长度数组。实际的结构将具有ExtentCount元素。您不能在这里使用Delphi动态数组。事实上,您永远不能在互操作中使用Delphi动态数组。
因此,就像C代码一样,将它声明为array [0..0]。为了访问它,您需要禁用范围检查。此记录的实际实例将在索引0..ExtentCount-1中包含有效数据。
对于整型类型,将C中的DWORD映射到Delphi中的DWORD。C语言中的LARGE_INTEGER到Delphi语言中的LARGE_INTEGER。这两种方法都不同于Delphi Integer。前者是无符号的,后者是64位宽。
PRetrievalPointersBuffer = ^TRetrievalPointersBuffer;
TRetrievalPointersBuffer = record
ExtentCount: DWORD;
StartingVcn: LARGE_INTEGER;
Extents: array [0..0] of record
NextVcn: LARGE_INTEGER;
Lcn: LARGE_INTEGER;
end;
end;LARGE_INTEGER类型使用起来相当笨拙。您可能更喜欢将这些字段声明为Int64。
这种类型的结构总是堆分配的。堆分配代码必须计算出适合可变长度数组中的ElementCount项所需的大小。如果您正在分配缓冲区,那么您将需要一个单独定义的类型中的内部记录,以便您可以方便地命名它,以便将其传递给SizeOf。如果API进行了分配,那么您就可以如上所述了。
发布于 2012-10-07 04:31:07
将TExtents定义为array of TExtent是错误的。这就是将它声明为一个动态数组,一个托管引用类型。您需要的是一个有界数组,比如array [x..y] of TExtent。
然而,这个C声明相当奇怪,因为它被声明为一个只有一个元素的数组。如果你想精确地复制它,你应该把它声明为array [0..0] of TExtent。
发布于 2012-10-07 04:46:13
StartingVcn、NextVcn和Lcn被定义为LARGE_INTEGER,在winnt.h中定义如下:
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
} DUMMYSTRUCTNAME;
struct {
DWORD LowPart;
LONG HighPart;
} u;
LONGLONG QuadPart;
} LARGE_INTEGER;根据您使用的Delphi版本的不同,您定义的结构可能无法工作。LARGE_INTEGER应该声明如下:
LARGE_INTEGER = record
case Integer of
0: ( LowPart: DWORD;
HighPart: Longint; );
1: ( QuadPart: LONGLONG);
end;龙龙实际上只是一个Int64。您可以使用LowPart和Highpart或QuadPart访问此结构。
希望这能有所帮助。
https://stackoverflow.com/questions/12763551
复制相似问题