gpt4 book ai didi

delphi - 如何将RETRIEVAL_POINTERS_BUFFER结构翻译为Delphi?

转载 作者:行者123 更新时间:2023-12-02 04:17:57 25 4
gpt4 key购买 nike

我正在使用 Windows API,必须重新创建 a structure在 Delphi 记录内。我想我已经记下来了,但是这个有点令人困惑,我需要确保我做对了。

这是原始的 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 中使用此结构时,它似乎确实有效。但是,由于结构内部有这个结构数组,我有点犹豫是否正确执行了此操作。这看起来合适吗?

最佳答案

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 分配了,那么你就可以像上面那样了。

关于delphi - 如何将RETRIEVAL_POINTERS_BUFFER结构翻译为Delphi?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12763551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com