C到delphi的转换

boj*_*vic 1 c windows delphi

有人可以告诉我在转换中我犯了什么错误:

C:

typedef struct _REGISTRY_EVENT {
    REG_NOTIFY_CLASS eventType;
    TIME_FIELDS time;
    HANDLE processId;
    ULONG dataType;
    ULONG dataLengthB;
    ULONG registryPathLengthB;
    /* Contains path and optionally data */
    UCHAR registryData[];
} REGISTRY_EVENT, * PREGISTRY_EVENT;
Run Code Online (Sandbox Code Playgroud)

德尔福:

_Registry_Event = record
    EventType: REG_NOTIFY_CLASS;
    Time: TIME_FIELDS;
    processID: THandle;
    DataType: ULONG;
    DataLength: ULONG;
    registryPathLength: ULONG;
    registryData: array of UCHAR;
end;
Run Code Online (Sandbox Code Playgroud)

来自c代码sizeof(REGISTRY_EVENT)= 36

来自delphi代码sizeof(REGISTRY_EVENT)= 40

提前致谢

博扬

klu*_*udg 7

错误在这里

registryData: array of UCHAR;
Run Code Online (Sandbox Code Playgroud)

这里不需要动态数组.


更新:

我认为

UCHAR registryData[];
Run Code Online (Sandbox Code Playgroud)

是一个在结构末端创建零长度字段的C hack.一个等效的Delphi黑客是

registryData: record end;
Run Code Online (Sandbox Code Playgroud)

要在Delphi中作为数组访问此虚拟字段,您应该进行类型转换:

type
  PByteArr = ^TByteArr;
  TByteArr = array[0..$FFFF] of Byte;

  PRec = ^TRec;
  TRec = packed record
    Data: Integer;
    MoreData: record end;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  P: PRec;
  PMoreData: PByteArr;

begin
  P:= AllocMem(SizeOf(TRec) + 4);
  PMoreData:= @P^.MoreData;
  PMoreData^[2]:= 3;
  ShowMessage(IntToStr(PMoreData^[2]));
  FreeMem(P);
end;
Run Code Online (Sandbox Code Playgroud)

但是你可能需要将这个虚拟字段强制转换为其他字段,因为字段定义只是一个黑客.

最后:在将C结构转换为Delphi时,切勿使用Delphi动态数组(如registryData:UCHAR数组;).Delphi中的动态数组是一种生命周期管理的引用类型,在C语言中没有完全等价