CTYPES를 사용하여 Python Callback 기능에 대한 라이브러리의 외부 기능 포인터를 설정하려면 어떻게합니까?

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

  •  20-08-2019
  •  | 
  •  

문제

일부 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top