Функция обратного вызова ctypes аварийно завершает работу Python — & quot; this & quot; параметр указателя?

Я вызываю C dll из Python, используя ctypes, и у меня возникают проблемы с передачей правильных параметров в IBSU_RegisterCallbacks функция, определенная ниже.

int WINAPI IBSU_RegisterCallbacks
(const int         handle,
const IBSU_Events event,
void             *pCallbackFunction,
void             *pContext);

Он описывает последний параметр как:

/* pContext Pointer to user context that will be passed to callback function.*/

Рабочий пример C ++ вызывает функцию следующим образом:

RegisterCallbacks(0, 1, OnCallback, this);

На данный момент в Python у меня есть код ниже (показан только соответствующий раздел), который завершает работу Python (без обратной трассировки) вскоре после запуска события и callback run! печатается.

from ctypes import *

class IBSU(object):
_dll = WinDLL('ibsu.dll')

_C_CALLBACK = CFUNCTYPE(
None,
c_int,                                         # device handle
c_void_p)                                      # user context

_register_callbacks = _dll.IBSU_RegisterCallbacks
_register_callbacks.restype = c_int
_register_callbacks.argtypes = (c_int,             # device handle
c_int,             # event type
c_void_p,          # callback function
c_void_p)          # user context

def _get_c_callback(self):
def callback(handle,                           # device handle
p_context):                       # user context
print 'callback run!'
return self._C_CALLBACK(callback)

def register_callbacks(self):
# keep ref to prevent garbage collection
self._c_callback = self._get_c_callback()

self._register_callbacks(0,                    # device handle
1,                    # event type
self._c_callback,     # callback function
c_void_p())           # user context

Что эквивалентно this в моем классе Python, который я могу отправить вместо просто c_void_p() в последней строке кода? Может ли неправильный выбор этого параметра вызвать сбой даже после срабатывания функции обратного вызова Python?

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]