python ctypes,回调函数增强类型是C++引用

标签 python c++ c ctypes

我通过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/

相关文章:

python - 即使 PEP8 指定 79,为什么 PyCharm 使用 120 个字符行?

python - 如何使 BufferedReader 的 peek 更可靠?

c - 使用 C 在 TCP 套接字中人工延迟,用于竞争条件利用

c++ - 如何调用这个函数模板?

c++ - 制作需要模板的模板

c - 代码出现段错误,怎么办?

python - 将 double 组从 C 发送到 Python 并返回

python - 我将如何禁止数字作为输入?

python - 导入 coremltools 时出错 - 无法导入名称 ParametricSoftPlus

c++ - "for(;;)"的用途是什么