كيف يمكنني استخدام ctypes لتحديد مؤشر الدالة خارجي ... مكتبة لدالة رد بيثون؟

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

  •  20-08-2019
  •  | 
  •  

سؤال

وبعض المكتبات C مؤشرات الدالة تصدير مثل أن المستخدم من مكتبة يحدد هذا المؤشر وظيفة إلى عنوان وظيفتها الخاصة لتنفيذ ربط أو رد.

في هذا المثال liblibrary.so مكتبة، كيف يمكنني ضبط library_hook إلى وظيفة بيثون باستخدام ctypes؟

وlibrary.h:

typedef int exported_function_t(char**, int);
extern exported_function_t *library_hook;
هل كانت مفيدة؟

المحلول

وهذا هو صعب في ctypes لمؤشرات ctypes وظيفة لا تنفذ الممتلكات .value استخدامه لتحديد مؤشرات أخرى. بدلا من ذلك، يلقي ظيفة رد ومؤشر الدالة خارجي ... لvoid * مع وظيفة c_void_p. بعد وضع مؤشر الدالة كما void * كما هو مبين، يمكن C استدعاء وظيفة بيثون الخاص بك، ويمكنك استرداد وظيفة كمؤشر وظيفة والذي يطلق عليه مع المكالمات 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