我正在使用Python 2.7并尝试使用ctypes加载一个dll:
lib = ctypes.cdll.LoadLibrary(" mylib.dll")
它有时会抛出以下错误,有时候运行正常。此外,使用Python 3始终会抛出此错误:
libcrypto = ctypes.cdll.LoadLibrary(" data \ openvpn \ libeay32")文件 " C:\ Python27 \ lib \ ctypes__init __。py",第440行,在LoadLibrary中 返回self._dlltype(name)文件" C:\ Python27 \ lib \ ctypes__init __。py",第362行, init self._handle = _dlopen(self._name,mode)WindowsError:[错误487]尝试访问无效地址
答案 0 :(得分:0)
我们在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。为了解决这个问题,我必须使用以下代码在C ++中创建一个新的Python包装程序可执行文件:
#include "Python.h"
#include "openssl\crypto.h"
auto volatile GetVersionOpenSSL{ &SSLeay };
int wmain(size_t const argc, wchar_t const *const argv[]) {
Py_Initialize();
int const result{ Py_Main(argc, const_cast<wchar_t**>(argv)) };
Py_Finalize();
return result;
}
请注意,我还必须执行以下其他操作:
使用相同的参数调用生成的可执行文件而不是python.exe,该错误应该消失。