Python ctypes dll加载错误487

时间:2017-08-30 11:57:08

标签: python windows python-2.7 dll ctypes

我正在使用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]尝试访问无效地址

1 个答案:

答案 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;
}

请注意,我还必须执行以下其他操作:

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

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