我有一个c语言的DLL,用于windows平台,其结构类似于以下内容:
C结构
typedef struct some_struct {
int (_stdcall *function)(int arg1, int arg2);
...
}SOME_STRUCT;
我定义了一个pythonctypes结构,用下面的代码模拟
Python结构
^{pr2}$C代码中这个结构的重点是注册一个回调函数,该函数在它自己的线程中对某些触发器执行。如果可能的话,我想要做的是将回调设置为一个Python函数,这样当C结构中的函数从C代码中被调用时,执行的是Python函数。在
我在python中尝试实现这一点(这不起作用)如下:
def func(arg1,arg2):
print('I was called!')
return 0
struct = SOME_STRUCT()
prototype = CFUNCTYPE(c_int, c_int, c_int)
struct.function = byref(prototype(func))
我得到的具体错误(这可能不是我唯一的问题)是它抱怨struct.function
需要一个LP_CFunctionType
实例,但得到了一个CArgObject
实例。我该怎么做我想做的事?在
下面是一个工作示例和测试DLL源代码。奇怪的是,当回调是结构的唯一成员时,我无法使它工作(崩溃)。它看起来像是一个bug,因为没有结构包装器的回调或向结构添加第二个成员就可以使它工作。在
注意事项:
WINFUNCTYPE
与__stdcall
一起使用。CFUNCTYPE
表示__cdecl
。在POINTER
或{@CALLBACK
修饰符等价于func = CALLBACK(func)
。在测试c
测试.py
^{pr2}$输出
相关问题 更多 >
编程相关推荐