Python ctypes dll 加载错误 487
Python ctypes dll load error 487
我正在使用 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
我们在使用 FIPS 认证的 OpenSSL 版本时遇到了类似的问题。不幸的是,该版本的 OpenSSL 需要加载到特定的内存地址。如果您在启动应用程序时尝试加载 OpenSSL 的时间太晚,则它所需的内存地址已经被另一个依赖项占用。我们能想到的最好办法是 "fix" 确保 OpenSSL (libeay32.dll) 尽快加载到内存地址 space。
根据您的情况,在 Python 脚本的 AT THE TOP 添加以下行(注意:AT THE TOP表示在任何其他可执行代码行之前,包括 import 语句):
import ctypes
from ctypes import cdll
from ctypes.util import find_library
cdll.LoadLibrary(find_library('libeay32'))
或者,您可以确保 libeay32.dll 是 mylib.dll.[= 中列出的第一个依赖项12=]
开始编辑
虽然上述代码在我的案例中有助于提高成功的可能性,但在某些情况下它仍然加载 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;
}
请注意,我还必须执行以下额外操作:
- 将libeay32.lib添加为链接器命令行中的第一个库
- 禁用链接器优化以删除未使用的引用
使用相同的参数调用生成的可执行文件而不是 python.exe,该错误应该会消失。
我正在使用 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
我们在使用 FIPS 认证的 OpenSSL 版本时遇到了类似的问题。不幸的是,该版本的 OpenSSL 需要加载到特定的内存地址。如果您在启动应用程序时尝试加载 OpenSSL 的时间太晚,则它所需的内存地址已经被另一个依赖项占用。我们能想到的最好办法是 "fix" 确保 OpenSSL (libeay32.dll) 尽快加载到内存地址 space。
根据您的情况,在 Python 脚本的 AT THE TOP 添加以下行(注意:AT THE TOP表示在任何其他可执行代码行之前,包括 import 语句):
import ctypes
from ctypes import cdll
from ctypes.util import find_library
cdll.LoadLibrary(find_library('libeay32'))
或者,您可以确保 libeay32.dll 是 mylib.dll.[= 中列出的第一个依赖项12=]
开始编辑
虽然上述代码在我的案例中有助于提高成功的可能性,但在某些情况下它仍然加载 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;
}
请注意,我还必须执行以下额外操作:
- 将libeay32.lib添加为链接器命令行中的第一个库
- 禁用链接器优化以删除未使用的引用
使用相同的参数调用生成的可执行文件而不是 python.exe,该错误应该会消失。