如何在 Python 中使用 ctypes 获取由序数而不是名称描述的 dll 中的全局变量的值?
How do I get the value of a global variable in a dll which is described by an ordinal not a name using ctypes in Python?
我正在使用 ctypes 库从 Python 访问一个 dll。 dll 中的函数可以通过序号而不是名称访问。我可以使用 Dependency Walker 检查 dll,并将序号与函数名称相关联。我希望访问的 dll 中有一个全局错误号变量。 Dependency Walker 显示它的序数值为 13。
似乎无法使用 ctypes 按顺序访问全局变量。
如果命名了全局变量,那么我似乎可以这样做:
error_value = c_int.in_dll(my_dll_handle, "my_error_value")
(https://docs.python.org/3/library/ctypes.html#accessing-values-exported-from-dlls)
关于如何访问仅给定序数的全局变量有什么想法吗?
除了序数访问的 函数 的语法外,我在文档中没有看到任何明确的内容。通过实验,以下方法有效:
测试代码:
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 库从 Python 访问一个 dll。 dll 中的函数可以通过序号而不是名称访问。我可以使用 Dependency Walker 检查 dll,并将序号与函数名称相关联。我希望访问的 dll 中有一个全局错误号变量。 Dependency Walker 显示它的序数值为 13。
似乎无法使用 ctypes 按顺序访问全局变量。
如果命名了全局变量,那么我似乎可以这样做:
error_value = c_int.in_dll(my_dll_handle, "my_error_value") (https://docs.python.org/3/library/ctypes.html#accessing-values-exported-from-dlls)
关于如何访问仅给定序数的全局变量有什么想法吗?
除了序数访问的 函数 的语法外,我在文档中没有看到任何明确的内容。通过实验,以下方法有效:
测试代码:
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