在Python中,如何使用ctypes获取由序号而不是名称描述的dll中全局变量的值?

在Python中,如何使用ctypes获取由序号而不是名称描述的dll中全局变量的值?,python,dll,ctypes,Python,Dll,Ctypes,我正在使用ctypes库从Python访问dll。dll中的函数可以通过序号而不是名称进行访问。我可以使用Dependency Walker检查dll,并将序号与函数名关联起来。我希望访问的dll中有一个全局错误号变量。Dependency Walker显示它的序数值为13 似乎没有办法使用ctypes通过序号访问全局变量 如果全局变量被命名,那么我似乎可以执行以下操作: error\u value=c\u int.in\u dll(my\u dll\u句柄,“my\u error\u valu

我正在使用ctypes库从Python访问dll。dll中的函数可以通过序号而不是名称进行访问。我可以使用Dependency Walker检查dll,并将序号与函数名关联起来。我希望访问的dll中有一个全局错误号变量。Dependency Walker显示它的序数值为13

似乎没有办法使用ctypes通过序号访问全局变量

如果全局变量被命名,那么我似乎可以执行以下操作:

error\u value=c\u int.in\u dll(my\u dll\u句柄,“my\u error\u value”) ()


关于如何访问只有序号的全局变量,我有什么想法吗?

除了序号访问的函数的语法之外,我在文档中没有看到任何明确的内容。通过实验,以下方面起到了作用:

测试代码:

int x = 5;
int func(int a) { return a*2; }
.DEF文件按顺序导出:

EXPORTS
  x @1 NONAME DATA
  func @2 NONAME
Python代码:

>>> from ctypes import *
>>> test = CDLL('test')
>>> test[2](5)           # Call ordinal 2 function.
10
>>> test[1]              # Ordinal 1 thinks it is a function pointer.
<_FuncPtr object at 0x0000000002FEA048>
>>> cast(test[1],POINTER(c_int)).contents        # cast?
c_long(5)                                        # Worked!
>>> cast(test[1],POINTER(c_int)).contents.value
5
>>从ctypes导入*
>>>测试=CDLL(“测试”)
>>>测试[2](5)#调用序号2函数。
10
>>>测试[1]#序号1认为它是一个函数指针。
>>>cast(测试[1],指针(c#u int))。内容#cast?
c#u long(5)#工作!
>>>cast(测试[1],指针(c_int)).contents.value
5.

我从未使用过这个,但您链接的页面上有一个部分似乎在讨论这个问题。我只是搜索序数。看看这是否有效。链接的页面显示了如何对函数使用序数,而不是变量