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.dllmylib.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;
}

请注意,我还必须执行以下额外操作:

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

使用相同的参数调用生成的可执行文件而不是 python.exe,该错误应该会消失。