带参数的Ctypes回调函数

2024-09-30 04:28:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我不知道我在这里问的是不是一个合适的方法(找不到任何类似的问题),但还是这样。在

我需要用自定义参数和ctypes参数一起启动回调函数。在

函数

def initMessageCallback(myData):

    callback = ctypes.CFUNCTYPE(ctypes.c_bool, ctypes.c_long) # return type and output parameter

    lib.SetMessageCallback.restype = ctypes.c_bool
    lib.SetMessageCallback(callback(callbackFunc))

回调函数

我可以访问SetMessageCallback返回的参数,但如何在initMessageCallback期间传递myData,这样我就可以在callbackFunc内部访问它而不使它成为全局变量?在

^{pr2}$

Tags: 方法函数参数returnlibdefcallbackctypes
1条回答
网友
1楼 · 发布于 2024-09-30 04:28:24

有几种方法可以做到这一点。回调可以是类中的方法,可以访问实例化类的实例数据,也可以将数据附加到回调本身。下面是后者的一个示例和一些回调代码示例:

测试c

#ifdef _WIN32
#   define API __declspec(dllexport)
#else
#   define API
#endif

typedef int (*CALLBACK)(int);

CALLBACK g_callback;

API void set_callback(CALLBACK cb)
{
    g_callback = cb;
}

API int do_callback()
{
    int sum = 0;
    for(int i = 0; i < 5; ++i) // Call callback with 0,1,2,3,4 parameters.
        if(g_callback)
            sum += g_callback(i); // Collect and sum the callback return values.
    return sum;
}

测试.py

^{pr2}$

输出

10
15

关于示例代码的注释。callback(callbackFunc)被创建并传递给lib.SetMessageCallback(),但由于该行执行后不存在引用,因此回调被销毁。当你尝试使用回调时,这会使你的系统崩溃。对回调函数使用decorator(@CALLBACK)就像我上面所做的那样,相当于my_callback = CALLBACK(my_callback)。函数名在全局级别,不会超出范围。所以在生成回调时请记住这一点。将它们存储在一个变量中,并确保它在作用域内,直到您处理完为止。在

相关问题 更多 >

    热门问题