Python ctypes dll加载错误487

2024-06-16 13:54:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Python 2.7并试图加载一个包含ctypes的dll:

lib = ctypes.cdll.LoadLibrary("mylib.dll")

它有时会抛出以下错误,而有时它运行正常。同样,对于Python 3,总是抛出以下错误:

libcrypto = ctypes.cdll.LoadLibrary("data\openvpn\libeay32") File "C:\Python27\lib\ctypes__init__.py", line 440, in LoadLibrary return self._dlltype(name) File "C:\Python27\lib\ctypes__init__.py", line 362, in init self._handle = _dlopen(self._name, mode) WindowsError: [Error 487] Attempt to access invalid address


Tags: nameinpyselfinitlib错误line
1条回答
网友
1楼 · 发布于 2024-06-16 13:54:58

我们在一个FIPS认证的OpenSSL版本上也遇到了类似的问题。不幸的是,该版本的OpenSSL需要加载到特定的内存地址。如果在启动应用程序时尝试加载OpenSSL太晚,那么它所需的内存地址已被另一个依赖项占用。我们能想到的最好的“修复”方法是确保OpenSSL(libeay32.dll)尽快加载到内存地址空间中。在

在您的例子中,在Python脚本的顶部添加以下行(注意:在顶部表示在任何其他可执行代码行之前,包括import语句):

import ctypes
from ctypes import cdll
from ctypes.util import find_library
cdll.LoadLibrary(find_library('libeay32'))

或者,您可以确保libeay32.dll中列出的第一个依赖项mylib.dll。在

开始编辑

在我的例子中,虽然上面的代码有助于提高成功的概率,但在某些情况下,它仍然加载OpenSSL DLL太迟了。为了解决这个问题,我必须创建一个新的Python包装器,它可以在C++中执行,代码如下:

^{pr2}$

请注意,我还必须采取以下额外行动:

  1. 添加libeay32.lib作为链接器命令行中的第一个库
  2. 禁用链接器优化以删除未使用的引用

调用生成的可执行文件而不是python.exe同样的论点,这个错误应该会消失。在

相关问题 更多 >