【问题标题】:Calling external dll after delphi upgradedelphi升级后调用外部dll
【发布时间】:2016-01-10 21:24:01
【问题描述】:

我已将我的 Delphi 2007 应用程序升级到 Delphi Seattle。在 Delphi 2007 中,我有一个从我的 Delphi 应用程序调用的 Fortran DLL。升级后出现错误“未找到程序端点”。请注意,Fortran DLL 没有变化,并且 dll 与应用程序 exe 位于同一路径中

Delphi 的调用代码是

type
  TArrayOfTypeNos= array [1..1000] of Integer;
....
procedure CallFunc(
  Idx : Integer; 
  var Nos : Integer;
  var ProductTypes : TArrayOfTypeNos
); stdcall; external 'MyFortranDLL.dll' name '_ThisIsFuncNameinFortran';

有人可以告诉我可能出了什么问题吗?

我得到的错误是:

在动态链接库中找不到过程入口点_ThisIsFuncNameinFortran

【问题讨论】:

  • 您提供的代码在西雅图的行为与 2007 年的行为没有什么不同。我不认识该错误消息。请您逐字引用错误消息,并包含minimal reproducible example
  • 我得到的错误是“过程入口点_ThisIsFuncNameinFortran不能位于动态链接库中”
  • @MartynA 它是由加载器通过加载时间链接隐式加载的,因为:external 'MyFortranDLL.dll'
  • @DavidHeffernan:谢谢,我错过了。

标签: delphi


【解决方案1】:

Delphi 2007 和 Delphi 10 Seattle 之间没有任何变化,以任何方式影响问题中显示的功能。

在 Unicode 之前的 Delphi 和 Unicode Delphi 之间移动时出现的常见问题与字符和字符串类型的处理差异有关。因此,Char 以前是 AnsiChar 的别名,但现在是 WideChar 的别名。 PCharstring 等也是如此。但这里不是这种情况。您使用的类型在 Delphi 2 以上的所有 Delphi 版本中具有相同的含义。

错误信息是:

在动态链接库中找不到过程入口点_ThisIsFuncNameinFortran。

只有一种方法可以解释该错误消息。 DLL 已被定位,但它实际上并没有导出具有该名称的函数。检查实际加载的 DLL 是否确实是您要加载的那个。 Dependency Walker 或类似工具可能会有所帮助。

【讨论】:

  • 如果只有一个dll,只有一个函数,他可以尝试动态加载dll(LoadLibrary)并使用GetModuleName来检查实际加载的是哪个dll。临时创建一个空的函数实现并注释外部声明,这样编译器就不会报错。
  • 配置文件模式下的依赖查看器包含调试所需的所有信息
【解决方案2】:

如果 DLL 真的没有改变,那么这个代码应该在 D2007 开始就失败了。它在 2007 年工作但在西雅图失败的事实可能意味着相同的 DLL没有被加载。您可以使用Process ExplorerProcess Monitor 之类的工具来查看实际加载的是哪个DLL。并使用 Embarcadero 的 TDUMP 实用程序查看 DLL 实际导出的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 2019-08-05
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    相关资源
    最近更新 更多