CTYPES를 사용하여 Python Callback 기능에 대한 라이브러리의 외부 기능 포인터를 설정하려면 어떻게합니까?
문제
일부 C 라이브러리는 기능 포인터를 내보내며 라이브러리의 사용자가 기능의 기능을 자신의 기능의 주소로 포인터로 설정하여 후크 또는 콜백을 구현합니다.
이 예에서 라이브러리 liblibrary.so
, ctypes를 사용하여 Library_hook를 Python 함수로 어떻게 설정합니까?
도서관 : :
typedef int exported_function_t(char**, int);
extern exported_function_t *library_hook;
해결책
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
제휴하지 않습니다 StackOverflow