gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:31:14 41 4
gpt4 key购买 nike

我经常使用 ctypes,但我遇到了一些我无法解释的事情。

首先,当我使用 c_void_p 定义回调时,回调将接收一个固定整数。

我看到一些其他帖子提到在使用 c_void_p 作为返回值时将 c_void_p 包装在另一个 POINTER 中。所以,我想我可以在回调定义中尝试这个参数:POINTER(c_void_p)。现在调用回调时我得到一个指针,但我仍然不知道它是否指向值数据。

由于 C_void_p 指向一个包含二进制数据的缓冲区,我不相信我可以使用 c_char_p。我使用要传递的长度转换为一个 unsigned-chars 数组,但是 Python 告诉我我有一个元组,并且没有我可以使用的“内容”或“值”属性。

建议?

最佳答案

在回调中接收一个 c_void_p 作为整数是正常的。它使用简单类型的 getfunc 进行自动转换——与将 c_void_p 作为 Structure 字段获取相同。 ctypes 不会对简单类型的子类进行自动转换——例如类型('my_void_p',(c_void_p,),{})。尽管我认为在这种情况下这并不重要。

假设您在 p 中有一个整数地址。您可以使用以下任一* 将其转换为长度为nc_char 数组:

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 转换器。

关于python - 在 Python 中使用 ctypes 的回调中的 c_void_p 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23268412/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com