繁体   English   中英

在Python中使用ctypes的回调中的c_void_p参数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM