【问题标题】:Read Vector Data from C++ dll?从 C++ dll 中读取矢量数据?
【发布时间】:2017-05-27 10:53:32
【问题描述】:

我在从 C++ dll 读取数据时遇到问题。我必须处理 C++ dll 中的数据和 Delphi 编写的 UI。我想将 TList 传递给 dll,然后 dll 将一些数据插入列表中。是有什么办法吗?更好的例子,最好的问候。

【问题讨论】:

  • 欢迎来到 Stack Overflow。请花时间阅读The Tour 并参考Help Center 中的材料,您可以在这里问什么以及如何问。
  • @Victoria Wut??
  • @Victoria 你应该再仔细阅读我的个人资料。
  • TList 与vector 不兼容,不能将TList 传递给dll。描述真正的问题,C++ 编译器,并展示 C++ dll 导出

标签: c++ list delphi dll


【解决方案1】:

您不能将特定于 Delphi 的类型(如 TList)传递给 C++ DLL,除非该 DLL 是用 C++Builder 编写的。

C++ 编译器将无法处理您的 Delphi 特定类型 TList(也不能处理任何其他类、动态数组、字符串、集合、开放数组等)。 Delphi 无法处理 C++ vector 类型(或任何其他模板或类类型)。 所以干脆不要这样做

即使你的 DLL 是用与 Delphi 编译器相同版本的 C++Builder 编写的,它知道 TList,你仍然会遇到问题,因为你正在处理两个不同的 RTL 实例,很多事情也无法正常工作(内存管理、RTTI 等)。

请注意,C++Builder 包也不是解决方案:Delphi 不能使用用 C++Builder 编写的 BPL。不过,C++Builder 可以使用 Delphi 包。

所以只需传递普通旧数据 (POD) 类型。传递简单类型的数组或简单类型的结构/记录,并将数组作为指针传递(指向第一个元素)。不要尝试传递动态数组或开放数组参数。这些又是 Delphi 特有的。

可以在 Delphi 端使用动态数组,只要您只传递一个指向第一个元素的指针,并且为 DLl 分配足够的空间来填充它。不要让 DLL 管理内存或尝试重新分配数组。它不能。将数据的最大长度作为额外参数传递。 DLL 应该只填充数组,不能再填充了。


对于它的价值,我写了一篇关于 DLL dos and don'ts 的文章。请阅读并注意它。这篇文章更详细地解释了我上面写的内容,以及更多关于编写跨语言边界使用的 DLL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-30
    相关资源
    最近更新 更多