如果序号地址在不同的组中,Python ctypes无法加载DLL

时间:2015-07-27 09:53:37

标签: python c windows dll ctypes

我正在尝试使用Python和ctypes加载DLL。我已经使用Visual Studio成功构建了x64的DLL。它是一个C库,所以我不期望任何C ++修改。我希望公开24种功能。我开始通过在头文件中使用__declspec(dllexport)前缀函数原型逐个公开它们。这是有效的(通过加载DLL与CDLL进行测试),直到我暴露了一定数量的函数。此后,我在加载DLL时看到以下错误:

Python 2.7.9 (default, Dec 10 2014, 12:28:03) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from ctypes import *
>>> mylib = CDLL("MyLib.dll")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\ctypes\__init__.py", line 365, in __init__
self._handle = _dlopen(self._name, mode)
WindowsError: [Error 182] The operating system cannot run %1

我还看到弹出的Windows错误对话框:

  

序号4950无法位于动态链接库

使用dumpbin进行检查我发现以下内容:

ordinal hint RVA      name

      1    0 000038A0 my_func_B
      2    1 00002CB0 my_func_G
      3    2 00002E90 my_func_D
      4    3 00003490 my_func_J
      5    4 00003030 my_func_K
      6    5 00003B60 my_func_A
      7    6 00003BE0 my_func_C
      8    7 00002E60 my_func_E
      9    8 00002DF0 my_func_L
     10    9 00003AD0 my_func_H
     11    A 00004000 my_func_F
     12    B 00003C60 my_func_I
     13    C 00003FD0 my_func_O
     14    D 00002D10 my_func_M
     15    E 00002CA0 my_func_N

注意相对虚拟地址(RVAs)如何高于00002xxx。当我删除一些__declspec(dllexport)以回到成功的python ctypes DLL导入状态时,dumpbin显示我:

ordinal hint RVA      name

      1    0 00002810 my_func_B
      2    1 00002490 my_func_G
      3    2 00002670 my_func_D
      4    5 00002640 my_func_A
      5    6 000025D0 my_func_C
      6    7 00002E60 my_func_E
      7    8 00002DF0 my_func_L
      8    9 00002A40 my_func_H
      9    A 00002F70 my_func_F
     10    B 00002BD0 my_func_I
     11    C 000024F0 my_func_O
     12    D 00002480 my_func_M
     13    E 00002CA0 my_func_N

注意RVAs是如何处于00002xxx范围内的。我继续玩游戏,如果序号地址与00001xxx和00002xxx混合,我看到相同的错误,但如果我删除函数导出成功,那么00001xxx范围内只有少数几个地址。

我只能假设我看到的错误与此观察有关。有什么想法吗?

0 个答案:

没有答案