将结构从C转换为Delphi

我正在为一个delphi单元转换一个C头文件。 我对联盟有怀疑。 例如,在下面的例子中,什么是逻辑(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;

    ...

在Delphi中

   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):
   ...

这是转换这种结构的正确方法吗?

工会被正确翻译。 您的Pascal变体记录是处理工会的正确方法。 记录的变体部分与C union的处理方式相同。 从文档:

变体部分的记录在语法上是复杂的,但在语义上看似简单。 记录的变体部分包含多个在内存中共享相同空间的变体。 您可以随时阅读或写入任何变体的任何字段; 但是如果你在一个变体中写入字段,然后写入另一个变体中的字段,则可能会覆盖自己的数据。


我可以在代码中看到的唯一问题是宏POINTER_ALIGNMENT 。 这个宏是什么扩展到? 我的期望是,它会扩展到__declspec(align(4))为32位的代码和__declspec(align(8))为64位代码。

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

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

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

链接地址: http://www.djcxy.com/p/78861.html

上一篇: Convert structure from C to Delphi

下一篇: Django custom PasswordResetForm