有人可以告诉我在转换中我犯了什么错误:
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
提前致谢
博扬
错误在这里
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语言中没有完全等价
| 归档时间: |
|
| 查看次数: |
504 次 |
| 最近记录: |