我通过ctypes将一个dll集成到python中,该dll需要设置一个回调函数。但dll回调函数声明如下
void setCallBack(void(*)(Data &a))
Data is C struct, declare as below
typedef struct {
int index,
....
}Data
我不清楚如何通过ctypes设置它,我尝试如下,但返回“WindowsError: [Error -1073741795] Windows Error 0xC000001D”错误,你能帮忙举个例子如何设置回调吗
mydll = cdll.LoadLibrary("XXX.dll")
callback_type = CFUNCTYPE(None, POINTER(Data))
callback = callback_type(Data)
mydll.setCallBack(callback)
def dataResponse(data):
print data.index
class Data(ctypes.Structure):
_fields_ = [("index", c_int)]
最佳答案
您的结构看起来正确,但如果您正在调用 Windows API,则您的调用约定可能会关闭(您正在使用 cdecl,但如果这是 Windows API 调用,则需要 stdcall)。
尝试将 mydll = cdll.LoadLibrary("XXX.dll")
替换为 mydll = WinDLL("XXX.dll")
您可能还需要提供一个使用 stdcall 而不是 cdecl 的回调函数。如果是这样,请将 CFUNCTYPE
切换为 WINFUNCTYPE
。您调用的 API 应提供有关其期望内容的详细信息。
看看这是否有帮助。
关于python ctypes,回调函数增强类型是C++引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43449880/