C ++ dll和Delphi dll之间是否存在真正的区别? 应用程序仅加载C ++ dll。 将调用约定更改为cdecl是没有用的 有没有办法找到一个DLL是否是一个C ++ DLL? 这个DLL有什么好处? 我的意思是Delphi dll可以有Delphi的参数和/或返回类型。 就像那个C ++ dll可能有一些独占数据类型/
感谢任何提示
答案 0 :(得分:8)
事实上,并非所有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中的函数: