C ++ dll和Delphi dll之间的区别

时间:2011-08-02 01:23:30

标签: delphi dll

C ++ dll和Delphi dll之间是否存在真正的区别? 应用程序仅加载C ++ dll。 将调用约定更改为cdecl是没有用的 有没有办法找到一个DLL是否是一个C ++ DLL? 这个DLL有什么好处? 我的意思是Delphi dll可以有Delphi的参数和/或返回类型。 就像那个C ++ dll可能有一些独占数据类型/

感谢任何提示

2 个答案:

答案 0 :(得分:8)

当然,C ++ dll可以使用或公开特定于C ++的项(C ++类,模板函数等),而Delphi DLL可以公开特定于Delphi的项(集合,字符串等)。但如果两者都写得正确,并且只使用其他语言也可以使用的东西,那么应该没有区别。

事实上,并非所有C ++或Delphi DLL都能正确编写。 Delphi中的默认调用约定是register(C ++ Builder中的__fastcall),而C和C ++默认使用cdecl。但通常两种语言都应使用stdcall

使用DLL的唯一方法是获取头文件(.h)或Delphi导入单元。 .h文件可以转换为导入单元。如果你只有一个DLL但没有这些,那么尝试猜测函数的参数没有多大意义。

如果您使用TDUMP.exe或Dependency Walker查看DLL,您可能会得到一个提示,正如另一个答案所述。对例如的依赖msvcrtXX.dll可能是一个很好的提示,它是一个C ++ DLL。

您也可以尝试从DLL中获取.tlb。您可以在IDE中执行此操作(从内存:“组件菜单” - “导入组件”或其他一些)。

如果你想知道调用约定,请阅读this,特别是关于找出调用约定的部分。

<强>加成

有些C ++程序员忘记在extern "C"块中包装它们的声明,因此导出的函数被破坏了。这可以告诉你哪些参数是必需的,但你会得到丑陋的名字。为此,Dependency Walker是一个很好的帮助,因为它可以翻译它们(至少对VC ++生成或兼容的DLL)。但是,它很难使用来自不同C ++编译器或C编译器的那些函数。

答案 1 :(得分:2)

您可以使用Dependency Walker检查DLL中的函数:

http://dependencywalker.com/