我经常使用ctypes,但是我遇到了一些我无法解释的事情。在
首先,当我用c_void_p定义回调时,回调将接收一个平面整数。在
我还看到其他一些帖子提到在使用c\uvoid\u p作为返回值时将c_void_p包装到另一个指针中。所以,我想我可以尝试一下回调定义中的参数:POINTER(c_void_p)。现在,当回调被调用时,我会得到一个指针,但我仍然不知道它是否指向值数据。在
因为C_void_p指向一个包含二进制数据的缓冲区,所以我不相信我可以使用C_char_p,我将转换成一个长度为我要传递的无符号字符数组,但是Python告诉我我我有一个元组,并且没有“contents”或“value”属性可以使用。在
建议?在
在回调中接收
c_void_p
作为整数是正常的。它使用简单类型的getfunc
进行自动转换,这与将c_void_p
作为Structure
字段相同。ctypes不会自动转换简单类型的子类,例如type('my_void_p', (c_void_p,), {})
。不过我觉得这不重要。在假设您在
p
中有一个整数地址。可以使用以下任一方法将其转换为长度为c_char
的n
数组:也就是说,知道它是一个}。在
char *
,我将定义回调以使用POINTER(c_char)
。然后通过索引或片访问缓冲区,例如p[0]
或{*
p[n]
等价于*(p + n)
,其中*
是解引用运算符,加法使用基于引用对象大小的指针算法。您可以使用p.contents
而不是p[0]
,但后者也会调用类型的getfunc
转换器(如果适用)。相关问题 更多 >
编程相关推荐