2024-05-11 09:28:26 发布
网友
有些C库导出函数指针,这样库的用户就可以将函数指针设置为自己函数的地址,以实现钩子或回调。在
在这个示例库liblibrary.so中,如何使用ctypes将library_hook设置为Python函数?在
liblibrary.so
图书馆.h:
typedef int exported_function_t(char**, int); extern exported_function_t *library_hook;
这在ctypes中很棘手,因为ctypes函数指针不实现用于设置其他指针的.value属性。相反,使用c_void_p函数将回调函数和外部函数指针强制转换为void *。如图所示,在将函数指针设置为void *之后,C可以调用Python函数,您可以将函数作为函数指针检索,并用普通的ctypes调用来调用它。在
.value
c_void_p
void *
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
这在ctypes中很棘手,因为ctypes函数指针不实现用于设置其他指针的
.value
属性。相反,使用c_void_p
函数将回调函数和外部函数指针强制转换为void *
。如图所示,在将函数指针设置为void *
之后,C可以调用Python函数,您可以将函数作为函数指针检索,并用普通的ctypes调用来调用它。在相关问题 更多 >
编程相关推荐