微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C到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;

delphi:

_Registry_Event = record EventType: REG_NOTIFY_CLASS; Time: TIME_FIELDS; processID: THandle; DataType: ULONG; DataLength: ULONG; registryPathLength: ULONG; registryData: array of UCHAR; end;

从c代码sizeof(REGISTRY_EVENT)= 36

在新安装时导入ssl错误:未定义“PROTOCOL_TLS”

如何在Windows上运行一个protobuf python插件

在R中导入一个* .xls文件

PHP使用外部主机名时响应速度慢

将数据从ServiceInstaller类传递到C#中的ServiceBase派生类

来自delphi的代码sizeof(REGISTRY_EVENT)= 40

提前致谢

博扬

subprocess stdin PIPE不会返回,直到程序终止

如何得到每秒接收和发送的networking字节数用于Windows的C ++中的进程(input:进程ID或句柄)?

嵌套循环与嵌套循环窗口批处理中使用的variables

如何通知其他应用程序我的应用程序是Windows桌面的一部分?

检查Windows API级别的DLL

错误在这里

registryData: array of UCHAR;

这里不需要动态数组。

更新:

我假设

UCHAR registryData[];

是在结构的末尾创建一个零长度字段的C hack。 一个等效的德尔福黑客是

registryData: record end;

要在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;

但可能你需要将这个虚拟域名转换成别的东西,因为域名定义只是一个破解而已。

最后: 不要使用Delphi动态数组 (比如registryData:UCHAR数组), 而将C结构转换为Delphi 。 Delphi中的动态数组是一个终身管理的参考类型,在C中没有完全相同的

我不知道这是一个错误 – 它可能是编译器之间插入一些填充字段。 尝试在记录定义之前添加{$Align off} ,或更改= Record to = Packed Record ,看看是否有帮助。

编辑:虽然这也可能是一个问题,@塞尔格的答案更有可能打击我。

UCHAR registryData[];

registryData: array[0..0] of UCHAR;

对于打包的记录和打包的数组,_Registry_Event的大小等于34。

这可能是由于每个字段的数据类型的大小不同,或者由于不同的填充。 对于字段大小,为每个字段打印sizeof()或size(),并进行比较。 如果他们都是一样的,那么它是填充,你可能需要找到一个编译器选项来调整。

那就是,如果你在乎的话。 为什么你在乎大小是否一样?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐