Это сложно в ctypes, потому что указатели на функции ctypes не реализуют свойство .value
, используемое для установки других указателей. Вместо этого приведите функцию обратного вызова и внешний указатель функции к void *
с помощью функции c_void_p
. После установки указателя функции на void *
, как показано, C может вызвать вашу функцию Python, и вы можете извлечь функцию как указатель на функцию и вызвать ее с помощью обычных вызовов ctypes.
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