有人可以告诉我,我在错误的转换:
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插件
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] 举报,一经查实,本站将立刻删除。