一个错误是你的回调是包装你的数据结构,而不是你的回调函数。更改:
callback_type = CFUNCTYPE(None, POINTER(Data))
callback = callback_type(Data)
mydll.setCallBack(callback)
def dataResponse(data):
print data.index至:
def dataResponse(data):
print data.index
callback = callback_type(dataResponse)
mydll.setCallBack(callback)或者您可以使用装饰器语法:
@CFUNCTYPE(None, POINTER(Data))
def dataResponse(data):
print data.index
mydll.setCallBack(dataResponse)这是一个完整的例子。还可以使用extern "C"来避免C++名称修改:
test.cpp(Windows)
struct Data {
int index;
};
typedef void (*CALLBACK)(Data&);
CALLBACK g_callback;
extern "C" {
__declspec(dllexport)void setCallBack(CALLBACK f) {
g_callback = f;
}
__declspec(dllexport) void func() {
Data d;
d.index = 42;
if(g_callback)
g_callback(d);
}
}test.py
from ctypes import *
class Data(Structure):
_fields_ = [('index',c_int)]
CALLBACK = CFUNCTYPE(None,POINTER(Data))
dll = CDLL('test')
dll.setCallBack.argtypes = CALLBACK,
dll.setCallBack.restype = None
dll.func.argtypes = None
dll.restype = None
@CALLBACK
def dataResponse(data):
print(data.contents.index)
dll.setCallBack(dataResponse)
dll.func()产量
42