【问题标题】:Coding a DLL in Delphi for calling from other languages在 Delphi 中编写一个 DLL 以便从其他语言调用
【发布时间】:2013-11-30 05:28:21
【问题描述】:

这是我第一次尝试在 Delphi 中编写 DLL 以从其他语言调用。

我做了很多谷歌搜索,看到了一些很好的建议,但没有详尽无遗(至少,我有一些问题在the Embarcadero material 中找不到答案)。

我想知道这个警告列表是否详尽无遗,或者我是否遗漏了什么,是否有人可以在下面回答我的问题。

  • 如果我希望我的 DLL 可以从其他语言调用,那么我不能使用 ShareMem 单元。
  • 我不能使用String 类型,应该坚持使用PChar
  • 如果我想返回一个字符串,调用者应该传递给我一个缓冲区来将它写入(我应该自己分配内存,即使我提供了一个例程来释放它之后)
  • 我应该坚持使用简单的类型,例如 integetrPChar(还有其他类型吗?)

几个问题:

  • 编译器禁止我导出枚举和常量。我只是没有正确声明它们吗?我想调用 Delphi s/w 以便能够使用枚举元素,并且所有调用者都能够使用常量。
  • 我不应该使用任何结构,因为编译器之间的字节对齐可能存在差异。所以,如果我不能接受结构作为参数。我想我应该只有integers 和PChars 的长参数列表?
  • 我可以接受数组作为参数吗,或者边界对齐会带来危险吗?
  • 我可以接受/返回浮点数/双精度数吗?
  • 布尔值?还是我坚持“zer0 === false,其他一切都是真的”?

  • 还有什么我应该知道的吗?

提前感谢您的帮助

【问题讨论】:

  • 您在“问题”中的所有结论都是错误的(可能除了第一个,它询问您是否声明了错误 - 您没有说明您是如何声明的,所以我们无法确定)。你可以做所有这些事情。如果你问一个更具体的问题,关于你的代码遇到的实际问题,那就更好了。
  • +1 肯,一如既往,你是大师。我知道这个问题的范围太广了。我只是想问一下——权威的书或 URL 是什么?我(你是如何)学会这样做的?
  • 没有关于互操作的权威书籍。所有专家都以同样的方式学习。一边走一边一块一块地捡起来。

标签: delphi dll enums export


【解决方案1】:

编译器禁止我导出枚举和常量。 我只是没有正确声明它们吗?我想打电话 Delphi s/w 能够使用枚举元素和所有 调用者能够使用常量。

您不能导出枚举类型和常量。调用者将不得不再次声明它们。类型也是如此。

我不应该使用任何结构,因为可能 编译器之间字节对齐的差异。

随意使用记录。对齐在同一平台上的编译器之间是标准化的。请确保您使用符合平台标准以正确对齐的现代 Delphi、XE2 或更高版本。

所以,如果我不能接受结构作为参数。我想我应该有一个很长的整数和 PChars 参数列表?

您可以接收记录作为参数。

我可以接受数组作为参数,还是边界 对齐使那危险?

您可以接受数组。您需要接收指向第一个元素的指针以及元素的数量。数组元素总是紧跟在前面的元素之后。

我可以接受/返回浮点数/双精度数吗?布尔值?还是我坚持“零===假而其他一切都是 真的”?

是的,您可以使用浮点类型和布尔值。

还有什么我应该知道的吗?

几乎可以肯定。

我会再提到一个问题,但肯定还有更多。不要将记录用作函数的返回类型。 Delphi 在处理记录的函数返回类型时不遵循平台标准。请改用 out 参数。


通过示例学习可以做什么的一个好方法是学习 Windows API。

【讨论】:

  • 这是一个普遍的问题,所以这里是一个普遍的答案。最好用具体的代码示例在具体问题中处理详细的跟进。
  • “不要使用记录作为函数的返回类型。Delphi 在处理记录的函数返回类型时不遵循平台标准。”你能扩展一下吗?我不知道使用返回记录有任何问题,如果有的话我想成为:)
  • @David Delphi 将记录作为额外的隐式 var 参数传递。标准平台,根据 MS C++ 编译器不同。与 C++、C# 等进行互操作时,您会遇到大记录问题。WideString 也是如此。看看我按投票排序的问题,以了解 WideString 返回值的覆盖范围,这是同一个问题。
  • 谢谢。我刚刚搜索了按投票排序的前十页答案(最高的第一页),只找到了one referring to WideString(加上它在顶部链接的那个。)你能指出你所指的答案吗取悦?
  • @DavidM 对不起,在我的手机上。是的,这是我问的一个问题。这里:stackoverflow.com/questions/9349530/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多