Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将结构中的C union转换为Delphi_Delphi - Fatal编程技术网

如何将结构中的C union转换为Delphi

如何将结构中的C union转换为Delphi,delphi,Delphi,我需要帮助将此C类型声明转换为Delphi: typedef struct _IO_STATUS_BLOCK { union { NTSTATUS Status; PVOID Pointer_; } ; ULONG_PTR Information; } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK; 从中的Hardlinks.pas: C联合可以在记录中使用case选择器进行转换,这里的问题是Delphi不允许case语句后面有任何内容

我需要帮助将此C类型声明转换为Delphi:

typedef struct _IO_STATUS_BLOCK {
  union {
    NTSTATUS Status;
    PVOID    Pointer_;
  } ;
  ULONG_PTR Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;

从中的
Hardlinks.pas


C联合可以在记录中使用case选择器进行转换,这里的问题是Delphi不允许case语句后面有任何内容。这可以通过嵌套Case语句解决,如下所示:

  _IO_STATUS_BLOCK = record
    case Integer of
      0: (
        case Integer of
        0: (
          Status: NTSTATUS);
        1: (
          Pointer_: Pointer);
      2: (Information: ULONG_PTR));
  end;
  IO_STATUS_BLOCK = _IO_STATUS_BLOCK;
  PIO_STATUS_BLOCK = ^IO_STATUS_BLOCK;
  _IO_STATUS_BLOCK = record
    case Integer of
      0: (
        Status: NTSTATUS;
        Pointer_: Pointer);
      1: (
        case Padding: DWORD of
          0: (
            Information: ULONG_PTR));
  end;
  IO_STATUS_BLOCK = _IO_STATUS_BLOCK;
  PIO_STATUS_BLOCK = ^IO_STATUS_BLOCK;
/编辑: 要使偏移量正确(请参见下面的注释),需要填充,下面是正确的版本。在这里,它没有提供太多的优势,但如果在第一个工会之后有更多的领域,甚至工会,它会:

  _IO_STATUS_BLOCK = record
    case Integer of
      0: (
        case Integer of
          0: (Status: NTSTATUS);
          1: (Pointer_: Pointer));
      1: (
        Pad: DWORD;
        Information: ULONG_PTR);
  end;
  IO_STATUS_BLOCK = _IO_STATUS_BLOCK;
  PIO_STATUS_BLOCK = ^IO_STATUS_BLOCK;
/编辑2: 更好的版本如下所示:

  _IO_STATUS_BLOCK = record
    case Integer of
      0: (
        case Integer of
        0: (
          Status: NTSTATUS);
        1: (
          Pointer_: Pointer);
      2: (Information: ULONG_PTR));
  end;
  IO_STATUS_BLOCK = _IO_STATUS_BLOCK;
  PIO_STATUS_BLOCK = ^IO_STATUS_BLOCK;
  _IO_STATUS_BLOCK = record
    case Integer of
      0: (
        Status: NTSTATUS;
        Pointer_: Pointer);
      1: (
        case Padding: DWORD of
          0: (
            Information: ULONG_PTR));
  end;
  IO_STATUS_BLOCK = _IO_STATUS_BLOCK;
  PIO_STATUS_BLOCK = ^IO_STATUS_BLOCK;

除了其他帖子之外,你可能还想阅读。Rudy是Delphi/C/C++互操作性的一个金矿。

在这个记录中,联合和“信息”应该占据相同的空间,记录大小将是4而不是8。测试它,将任何内容设置为“信息”,并从“状态”读取它。看,这与包含3个表达式的case语句是一样的,我认为这就是编译器抱怨“标记值重复”的原因。@Tondrej:我没有在编译器中进行测试就键入了它,我得到了与您相同的错误和修复(编辑了答案)。@Sertac Akyuz:SizeOf对此记录返回4,另外,当我将状态设置为1时,指针和信息都是$1,那么我怎么会没事呢?@Remko:问题是正确的翻译应该是:(偏移量0):状态/指针,然后是(偏移量4):信息,总共8个字节。@Remko-不。请原谅我的英语,我说不出我想要的是什么“信息”是一个独立的字段,请参阅TOndrej的评论。为什么信息在案例stmt中?此外,case stmt如何具有'case integer'的条件?案例stmt如何工作?它是否在内部并不重要。“案例0”只是内存布局的一种可能解释,“案例1”是另一种可能解释。Delphi只允许在记录结尾声明变量部分,我认为这是它位于case语句中的唯一原因。更正:在64位中,它取决于如何声明
NTSTATUS
。我认为上面的JCL代码依赖于这样一个事实,即
NTSTATUS
的大小与
指针的大小相同,为32位。因此,对于64位,可能需要修改翻译。