ctypes を使用して Python から C dll を呼び出していますが、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 コールバック関数が起動した後でもクラッシュする可能性がありますか?