どのように私はPythonのコールバック関数にライブラリのはextern関数ポインタを設定するためにctypesを使っていますか?

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

  •  20-08-2019
  •  | 
  •  

質問

いくつかのCライブラリのユーザは、フックやコールバックを実装するために、独自の関数のアドレスにその関数のポインタを設定するように、エクスポート関数ポインタをライブラリます。

この例ライブラリliblibrary.soでは、どのように私は、ctypesのを使用してPythonの関数にlibrary_hookを設定するのですか?

library.hます:

typedef int exported_function_t(char**, int);
extern exported_function_t *library_hook;
役に立ちましたか?

解決

のctypes関数ポインタが他のポインタを設定するために使用.valueプロパティを実装していないので、これはctypesので注意が必要です。代わりに、コールバック関数とvoid *機能をc_void_pするのextern関数ポインタをキャスト。示すように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