3

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

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

ライブラリ.h:

typedef int exported_function_t(char**, int);
extern exported_function_t *library_hook;
4

1 に答える 1

9

.valuectypes の関数ポインターは、他のポインターを設定するために使用されるプロパティを実装しないため、これは ctypes では注意が必要です。代わりに、コールバック関数と extern 関数ポインターを関数でキャストし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
于 2009-01-29T17:39:14.423 に答える