Come posso usare ctypes per impostare il puntatore alla funzione extern di una libreria su una funzione di callback Python?

StackOverflow https://stackoverflow.com/questions/492377

  •  20-08-2019
  •  | 
  •  

Domanda

Alcune librerie C esportano i puntatori di funzione in modo tale che l'utente della libreria imposti quel puntatore di funzione sull'indirizzo della propria funzione per implementare un hook o callback.

In questa libreria di esempio liblibrary.so, come posso impostare library_hook su una funzione Python usando i tipi?

library.h:

typedef int exported_function_t(char**, int);
extern exported_function_t *library_hook;
È stato utile?

Soluzione

Ciò è complicato in ctypes perché i puntatori della funzione ctypes non implementano la proprietà .value utilizzata per impostare altri puntatori. Al contrario, eseguire il cast della funzione di callback e del puntatore della funzione extern su void * con la funzione c_void_p. Dopo aver impostato il puntatore a funzione come <=> come mostrato, C può chiamare la funzione Python e puoi recuperare la funzione come puntatore a funzione e chiamarla con normali chiamate di tipo.

from ctypes import *

liblibrary = cdll.LoadLibrary('liblibrary.so')

def py_library_hook(strings, n):
    return 0

# First argument to CFUNCTYPE is the return type:
LIBRARY_HOOK_FUNC = CFUNCTYPE(c_int, POINTER(c_char_p), c_int)
hook = LIBRARY_HOOK_FUNC(py_library_Hook)
ptr = c_void_p.in_dll(liblibrary, 'library_hook')
ptr.value = cast(hook, c_void_p).value
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top