【问题标题】:Convert structure from C to Delphi将结构从 C 转换为 Delphi
【发布时间】:2014-06-27 09:42:26
【问题描述】:

我正在将 C 标头转换为 delphi 单元。我对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):
   ...

【问题讨论】:

    标签: c delphi data-structures type-conversion


    【解决方案1】:

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

    联合被正确翻译。您的 Pascal 变体记录是处理联合的正确方法。记录的变体部分与 C 并集的处理方式相同。来自documentation

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


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

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

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

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

    【讨论】:

    • 我不清楚系统如何选择案例中的选项。据我了解,就好像我有一个可以是 TCreate 或 TCreatePipe 的 VARIANT 类型。这是正确的吗?
    • 你了解工会的运作方式吗?记录的变体部分是相同的。我已经包含了一个文档链接和一个摘录。如果您向我展示POINTER_ALIGNMENT 是什么,这也将非常有帮助,这样我就不必猜测了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多