Как мне использовать ctypes для установки указателя внешней функции библиотеки на функцию обратного вызова Python?

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

  •  20-08-2019
  •  | 
  •  

Вопрос

Некоторые библиотеки C экспортируют указатели на функции таким образом, что пользователь библиотеки устанавливает этот указатель на функцию на адрес своей собственной функции для реализации перехвата или обратного вызова.

В этом примере библиотеки liblibrary.so, как мне установить library_hook для функции Python , используя ctypes?

библиотека.h:

typedef int exported_function_t(char**, int);
extern exported_function_t *library_hook;
Это было полезно?

Решение

Это сложно в 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top