0

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 コールバック関数が起動した後でもクラッシュする可能性がありますか?

4

0 に答える 0