Как использовать ctypes для установки указателя функции extern библиотеки на функцию обратного вызова Python?
Некоторые библиотеки C экспортируют указатели функций таким образом, что пользователь библиотеки устанавливает указатель этой функции на адрес своей собственной функции для реализации Хука или обратного вызова.
В этом примере библиотеки liblibrary.so
, Как установить library_hook в функцию Python с помощью ctypes?
.h:
typedef int exported_function_t(char**, int);
extern exported_function_t *library_hook;
1 ответ:
Это сложно в ctypes, потому что указатели функций ctypes не реализуют свойство
.value
, используемое для задания других указателей. Вместо этого приведите функцию обратного вызова и указатель функции extern к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