ctypes Python e ponteiros de função
-
22-08-2019 - |
Pergunta
Isto está relacionado com minha outra pergunta , mas Eu senti como se deve perguntar-lo em uma nova pergunta.
Basicamente FLAC utiliza ponteiros de função para retornos de chamada, e implementar retornos de chamada com ctypes, você usa CFUNCTYPE
ao protótipo eles, e então você usa a função prototype()
para criá-los.
O problema que tenho com isso é que eu percebi que eu iria criar minha função de retorno de chamada como tal (não estou mostrando as estruturas que tenho recriado, FLAC__Frame é uma estrutura):
write_callback_prototype = CFUNCTYPE(c_int, c_void_p,
POINTER(FLAC__Frame),
POINTER(c_int32), v_void_p)
O problema que eu tenho é a implementação. FLAC__Frame nunca é instanciado pelo programador, ele só é chamado a partir da função de inicialização, e os functions.I processamento tem que escrever a função de retorno de mim mesmo, mas ele problema é que eu não sei como eu iria fazer isso, então se alguém sabe como eu deveria fazer isso, então alguma ajuda seria muito apreciada.
Solução
De acordo com a ctypes callback docs você pode definir a função python
def my_callback(a, p, frame, p1, p2)
pass
e, em seguida, criar um ponteiro para uma função que pode ser chamado C como este:
callback = write_callback_prototype(my_callback)
Esta ponteiro de função pode então ser passado em FLAC
Outras dicas
O problema que eu tenho é a implementação. FLAC__Frame nunca é instanciado pelo programador, ele só é chamado a partir da função de inicialização, e os functions.I processamento tem que escrever a função de retorno de mim mesmo, mas ele problema é que eu não sei como eu iria fazer isso, então se alguém sabe como eu deveria fazer isso, então alguma ajuda seria muito apreciada.
Nesse caso, basta usar:
import ctypes
class FLAC__Frame(ctypes.Structure):
pass
e fingir que já está definido, e não se importam porque você só precisa ponteiro para ele, que é basicamente posição na memória.