升级 Delphi 后调用外部dll

s4n0splo  于 2022-11-04  发布在  其他
关注(0)|答案(3)|浏览(151)

我已经将我的 Delphi 2007应用程序升级到Delphi西雅图。在Delphi 2007中,我有一个Fortran DLL,它是从我的Delphi应用程序调用的。升级后,我得到一个错误“未找到过程端点”。请注意,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

kcrjzv8t

kcrjzv8t1#

在 Delphi 2007和Delphi 10西雅图之间没有任何变化会以任何方式影响问题中显示的函数。
在Unicode Delphi 之前的版本和Unicode Delphi之间转换时出现的常见问题,与字符和字符串类型的处理方式不同有关。因此,Char以前是AnsiChar的别名,但现在是WideChar的别名。同样,对于PCharstring等等。但这里不是这样的。你使用的类型在Delphi 2以上的所有 Delphi 版本上都有相同的含义。
错误消息为:
在动态链接库中找不到过程入口点_ThisIsFuncNameinFortran。
只有一种方法可以解释该错误信息。DLL已经找到,但它确实没有导出具有该名称的函数。请检查实际加载的DLL是否确实是您要加载的DLL。Dependency步行者或类似的工具可能会有所帮助。

ui7jx7zq

ui7jx7zq2#

如果DLL确实没有更改,这段代码在D2007中应该已经失败了。它在2007中可以工作,但在西雅图中失败的事实可能意味着同一个DLL没有被加载。你可以使用Process ExplorerProcess Monitor之类的工具来查看哪个DLL实际上被加载了。然后使用Embarcadero'的TDUMP公用程式,以查看DLL实际汇出的函式。

6yoyoihd

6yoyoihd3#

我遇到了同样的问题与 Delphi 10. 4使用微芯片dll。相同的代码& dll工程完美的fpc &拉撒路。
函数的名称类似于.h文件中的Mcp2221_OpenByIndex,但在dll中则是带有前导下划线的_Mcp2221_OpenByIndex;函数定义为:

function Mcp2221_OpenByIndex(VID: Word; PID: Word; index: Word)     : mcpHandle_; external MCP_DLL; name '_Mcp2221_OpenByIndex';

MCP_DLL是一个包含名称的常量。当我删除下划线时,找不到这个函数。如果我在所有函数中添加下划线,第二个函数仍然会出现错误。

相关问题