【发布时间】:2021-08-16 12:15:42
【问题描述】:
我有一个 Delphi 库,我想将其编译为 DLL (PyMinMod_TRANS.dll),该库可以从 Python 或 Julia 等其他编程语言调用。从 RADStudio Delphi 10.4 编译到 Windows 32 位并通过 32 位 Python 2 调用它时
import ctypes as ct
PyMinMod_TRANS = ct.WinDLL('D:/Users/pjuergen/Dateien/git-repositories/remod-test/PyMinMod_TRANS.dll')
一切都按预期进行。
但是,如果我将它编译到 Windows 64 位并尝试从 64 位 Python 3(或 Julia)调用它,我会收到一条错误消息 WindowsError: [错误 126] 找不到指定的模块
我用 Dependency Walker 打开了PyMinMod_TRANS.dll,我发现很多缺失的依赖项,其中很多以API-MS-WIN 或EXT-MS 开头,还有PYTHON27.DLL、HVSIFILETRUST.DLL 和IESHIMS.DLL。
但是这并不能帮助我解决问题:)
我要编译的 Delphi 库使用包 System.SysUtils、PyAPI、math、classes、vcl.FileCtrl。
我发现 PyAPI-File 来自这个来源:https://wiki.freepascal.org/Developing_Python_Modules_with_Pascal
换行
PythonLib = 'python27.dll';
到
PythonLib = 'python37.dll';
导致另一个错误 OSError: [WinError 127] 找不到指定的程序, 但是 Dependency Walker 的报告看起来几乎一样。
如何才能在 Python 3 和 Julia(64 位)中加载 DLL?
【问题讨论】:
-
在 Python 和 Julia 中加载 Delphi DLL 没什么大不了的。只需创建一个 DLL 并编译它,确保使用 64 位目标。该问题可能与您的 DLL 的依赖关系有关,我们对此一无所知。 Dependency Walker 在现代 Windows 版本中不可靠。您需要调试自己的 DLL。我们不能那样做。
-
你得到的错误WindowsError: [Error 126] The specified module could not be found是python代码还是DLL代码生成的?我猜是python代码。 DLL 可能不在您期望的位置。使用 ProcessMonitor 查看 python 尝试加载的内容以及获取的依赖项。如果错误来自 DLL 代码,则使用 Delphi 调试器调试 DLL。如果您不知道如何调试 DLL,请提出一个新问题。
-
这个问题需要更多的关注。您是否有一个测试应用程序来验证 DLL 的功能?如果没有,请制作一个并测试您的 DLL 以确保它按预期工作。如果可行,那么您的 DLL 很好,这严格来说是 python/julia 的配置问题(即:DLL 的路径不正确)。如果 DLL 在测试应用程序中不起作用,那么这与 python/julia 无关 - 无论哪种方式,您都可以在提出问题之前缩小这个问题的范围。
-
嗯,问题是“如何在 Delphi 中创建 64 位 DLL ...”。我有一个使用 Delphi-Code 的应用程序,它可以在 32 位和 64 位下工作。我还有一个 Python 2(32 位)应用程序,它加载 32 位 DLL 并按预期工作。问题是:如何让 Delphi/RADStudio 创建一个 64 位 DLL,它也可以按预期工作?作为 Python-Delphi-Interface,我使用的是此处发布的内容:wiki.freepascal.org/Developing_Python_Modules_with_Pascal 但是我无法弄清楚如何配置此 PyAPI 文件以创建适用于 python 3.7 的 64 位 DLL。
-
但是现在 [Error 126] 不见了?这意味着 DLL 加载正常,而您只是试图调用 DLL 没有的导出名称。检查 Dependency Walker,可能在切换到 64 位时导出的名称会发生变化...