delphi记录和c结构

时间:2009-12-07 01:25:42

标签: c delphi struct record

任务:

用Delphi编写的应用程序接受三个字段的结构(就Delphi而言record)。我可以使用SendMessage(Win32 API)函数发送此结构的指针。

所以问题是:

如何根据Delphi在Delphi的内存中维护某些结构表示?

它有类型

PWPModPostData = ^ TWPModPostData;
TWPModPostData = record
   DataType: Integer;
   Data: PChar;
   Next: PWPModPostData;
end;

如何在C中定义它?我的意思是,Delphi结构中是否有隐藏或服务字段?

2 个答案:

答案 0 :(得分:9)

不,没有隐藏字段,Delphi记录和C结构可以1:1相互映射,但需要注意几点:

  • 不要使用C类型的任何数据类型 了解。这包括对象, 动态数组和Delphi字符串。

  • C和Delphi有时会有所不同 关于如何字节对齐字段的想法。 测试您的记录并验证 他们在C方面工作。如果他们 不要,尝试使用打包记录 而不是记录

  • 将指针传递给记录时 从C到Delphi,反之亦然 确定接收它的一方 不试图释放或重新分配 记忆。它属于记忆 创建它的经理。

答案 1 :(得分:4)

请注意,虽然您当然可以将此类结构的地址作为LPARAM调用的SendMessage()发送到另一个应用程序,但它很可能无效。原因是当在具有自己的地址范围的另一个应用程序中使用时,相同的指针通常不会指向相同的物理内存位置。

它适用于一些Windows消息,如WM_GETTEXT,在这些情况下,操作系统会在幕后进行必要的映射,以便接收应用程序可以将数据复制到调用应用程序分配的缓冲区,并且地址指向两个应用程序中相同的物理内存块。

使用WM_COPYDATA消息可以实现同样的目的,该消息旨在在两个应用程序之间进行数据交换时进行必要的内存编组。

但是你问题中的结构有另一个问题,因为它包含指向内存的指针。 WM_COPYDATA文档明确指出不得这样做。虽然整个存储器块的地址将被修改为在接收应用程序中有效,但系统不能知道存储器块的哪些部分是指针并且也需要被映射。因此,所有包含的指针将保持原样并且可能无效。您的单链表将被破坏,PChar元素也无法访问。

修改

关于您的评论:只有当您尝试从其他应用程序发送消息时,以上几点才是重要的。如果你从DLL执行此操作将会起作用,因为DLL共享它加载到的进程的地址空间,因此应用程序中使用的指针或任何加载的DLL将始终指向相同的内存位置。对于这可能造成的任何混淆感到抱歉,但是对于我来说,从一个应用程序内部发生数据交换的问题并不明显。