在Delphi中编写DLL以从其他语言调用

时间:2013-11-30 05:28:22

标签: delphi dll enums export

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

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

我想知道这个警告列表是否有效,或者我是否遗漏了任何内容,以及是否有人可以在下面提出我的问题。

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

几个问题:

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

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

提前感谢您提供任何帮助

1 个答案:

答案 0 :(得分:8)

  

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

您无法导出枚举类型和常量。调用者必须再次声明它们。类型也是如此。

  

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

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

  

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

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

  

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

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

  

我可以接受/返回浮点数/双打吗?布尔?或者我坚持“零===假,其他一切都是   真的“?

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

  

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

几乎可以肯定。

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


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