Python ctypes 和函数指针

1 投票
2 回答
14612 浏览
提问于 2025-04-15 11:39

这和我之前提到的另一个问题有关,但我觉得应该单独问一下。

简单来说,FLAC使用函数指针来处理回调,而要在Python中用ctypes实现这些回调,你需要用CFUNCTYPE来定义它们的格式,然后用prototype()函数来创建它们。

我遇到的问题是,我想创建我的回调函数(这里不展示我重建的结构体,FLAC__Frame是一个结构体):

write_callback_prototype = CFUNCTYPE(c_int, c_void_p, 
                                     POINTER(FLAC__Frame), 
                                     POINTER(c_int32), v_void_p)

我遇到的问题在于实现部分。FLAC__Frame并不是由程序员直接实例化的,它只是在初始化函数和处理函数中被调用。我需要自己编写回调函数,但我不知道该怎么做。如果有人知道该怎么做,帮忙指点一下就太好了。

2 个回答

1

我遇到的问题是实现方面的。FLAC__Frame这个东西程序员是不会自己创建的,它只会在初始化函数和处理函数中被调用。我需要自己写一个回调函数,但问题是我不知道该怎么做。如果有人知道该怎么做的话,帮帮我就太感谢了。

在这种情况下,你只需要使用:

import ctypes

class FLAC__Frame(ctypes.Structure):
    pass

然后假装它已经定义好了,不用太在意,因为你只需要一个指向它的指针,简单来说就是内存中的一个位置。

7

根据ctypes回调文档,你可以定义一个Python函数

def my_callback(a, p, frame, p1, p2)
    pass

然后可以像这样创建一个指向C语言可调用函数的指针:

callback = write_callback_prototype(my_callback)

这个函数指针可以传递给FLAC使用。

撰写回答