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

标签 delphi dll

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

感谢您的任何提示

最佳答案

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" block 中,因此导出的函数被破坏。这可以告诉您需要哪些参数,但您会得到难看的名称。为此,Dependency Walker 是一个很大的帮助,因为它可以翻译它们(至少对于 VC++ 生成的或兼容的 DLL)。不过,它使得使用来自不同 C++ 编译器或 C 编译器的这些函数变得相当困难。

关于delphi - C++ dll 和 Delphi dll 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6906346/

相关文章:

delphi - 如何获取TGroupBox主题标题字体颜色

c++ - 如何更改 DLL 中的过程名称

linux - linux/gcc 中是否有 rebase (dll) 命令?

c# - 来自 C# : why do I have to override new/delete? 的 mingw DLL

c# - 从 C# 调用旧的 OLE 组件

c++ - 访问某个dll方法时访问冲突读取位置

delphi - 检测到在 AQTime 下运行?避免调试代码崩溃

delphi - 使对话框与 "large fonts"兼容。

delphi - 使用 Delphi 显示当前用户的语言(英文)?

Delphi - 连接到 Oracle 并调用 Web 服务方法后关闭时 ntdll.dll 中出现异常