[英]c_void_p arguments in callbacks using ctypes in Python
我是ctypes的常用用户,但我遇到了一些我无法解释的事情。
首先,当我使用c_void_p定义回调时,回调将接收一个扁平整数。
我看到其他一些帖子提到在使用c_void_p作为返回值时,在另一个POINTER中包装c_void_p。 所以,我认为我可以在回调定义中为参数尝试这个:POINTER(c_void_p)。 现在,我在调用回调时得到一个指针,但我仍然不知道它是否指向值数据。
由于C_void_p指向具有二进制数据的缓冲区,我不相信我可以使用c_char_p。 我使用我传递的长度转换为一个unsigned-chars数组,但是Python告诉我我有一个元组,并且没有我可以使用的“contents”或“value”属性。
建议?
在回调中接收c_void_p
作为整数是正常的。 它使用简单类型的getfunc
来进行自动转换 - 就像将c_void_p
作为Structure
字段一样。 ctypes不会对简单类型的子类进行自动转换 - 例如type('my_void_p', (c_void_p,), {})
。 虽然我不认为这种情况很重要。
假设你在p
有一个整数地址。 可以将它转换为一个c_char
长度的阵列n
使用以下的任*:
buf = cast(p, POINTER(c_char * n))[0]
# 2.6+
buf = (c_char * n).from_address(p)
也就是说,知道它是一个char *
,我将回调定义为使用POINTER(c_char)
。 然后通过索引或切片访问缓冲区,例如p[0]
或p[:n]
。
* p[n]
等价于*(p + n)
,其中*
是解引用运算符,并且加法使用基于指示对象大小的指针算法。 您可以使用p.contents
而不是p[0]
,但后者也会调用类型的getfunc
转换器(如果适用)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.