gpt4 book ai didi

将结构从 C 转换为 Delphi

转载 作者:太空狗 更新时间:2023-10-29 17:12:27 25 4
gpt4 key购买 nike

我正在为一个 delphi 单元转换一个 C 头文件。我对 UNION 有疑问。例如,在下面的示例中,(CASE INTEGER OF) 中应用的逻辑是什么?这是转换此结构的正确方法吗?

在 C 中

typedef union _FLT_PARAMETERS {

struct {
PIO_SECURITY_CONTEXT SecurityContext;
ULONG Options;
USHORT POINTER_ALIGNMENT FileAttributes;
USHORT ShareAccess;
ULONG POINTER_ALIGNMENT EaLength;
PVOID EaBuffer;
LARGE_INTEGER AllocationSize;
} Create;

struct {
PIO_SECURITY_CONTEXT SecurityContext;
ULONG Options;
USHORT POINTER_ALIGNMENT Reserved;
USHORT ShareAccess;
PVOID Parameters; // PNAMED_PIPE_CREATE_PARAMETERS
} CreatePipe;

...

在德尔福

   TCreate = record
SecurityContext: PIO_SECURITY_CONTEXT;
Options: ULONG;
FileAttributes: USHORT;
ShareAccess: USHORT;
EaLength: ULONG;
EaBuffer: PVOID;
AllocationSize: LARGE_INTEGER;
end;

TCreatePipe = Record
SecurityContext: PIO_SECURITY_CONTEXT;
Options: ULONG;
Reserved: USHORT;
ShareAccess: USHORT;
Parameters: PVOID;
end;

_FLT_PARAMETERS = Record
case integer of
0: (Create: TCreate);
1: (CreatePipe: TCreatePipe):
...

最佳答案

Is this the correct way to convert this structure?

union 翻译正确。您的 Pascal 变体记录是处理 union 的正确方法。记录的变体部分被视为与 C union 相同。来自documentation :

Records with variant parts are complicated syntactically but deceptively simple semantically. The variant part of a record contains several variants which share the same space in memory. You can read or write to any field of any variant at any time; but if you write to a field in one variant and then to a field in another variant, you may be overwriting your own data.


我在您的代码中看到的唯一问题是宏 POINTER_ALIGNMENT。该宏扩展到什么?我的期望是它将扩展到 __declspec(align(4)) 用于 32 位代码和 __declspec(align(8)) 用于 64 位代码。

假设猜测是正确的,您的 Delphi 代码在为 32 位编译时将已经具有正确的布局。这是因为用 POINTER_ALIGNMENT 标记的每个字段都已经放置在 4 字节边界上。

但是 64 位的记录不会正确布局。如果您的目标是 64 位,则必须添加一些额外的填充,因为每个标记有 POINTER_ALIGNMENT 的成员都会被错误地布局。不幸的是,在 Delphi 中没有与 __declspec(align(#)) 等效的方法,因此您需要手动添加填充。

如果您确实需要添加此填充,您应该非常仔细地检查 C 和 Delphi 版本是否具有相同的布局。检查每个字段的偏移量是否匹配。

关于将结构从 C 转换为 Delphi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23568184/

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