gpt4 book ai didi

python - 在 C 中为函数指针回调函数编写 Python ctypes

转载 作者:太空狗 更新时间:2023-10-29 21:29:19 34 4
gpt4 key购买 nike

我正在尝试编写 python 代码来调用 dll 函数并卡在下面的函数中,我认为这与 typedef 回调函数或函数指针有关。

我已经测试了下面的代码,当调用回调函数时,python 崩溃(窗口通知——python.exe 已停止响应),没有调试消息。

我很困惑,任何帮助将不胜感激:)

谢谢!

C:

#ifdef O_Win32
/** @cond */
#ifdef P_EXPORTS
#define API __declspec(dllexport)
#else
#define API __declspec(dllimport)
#endif // #ifdef P_EXPORTS
/** @endcond */
#endif // #ifdef O_Win32

// Type definition
typedef void (__stdcall *StatusCB)(int nErrorCode, int nSID, void *pArg);

//Function
void GetStatus(StatusCB StatusFn, void *pArg);

python :

from ctypes import *

def StatusCB(nErrorCode, nSID, pArg):
print 'Hello world'

def start():
lib = cdll.LoadLibrary('API.dll')
CMPFUNC = WINFUNCTYPE(c_int, c_int, c_void_p)
cmp_func = CMPFUNC(StatusCB)
status_func = lib.GetStatus
status_func(cmp_func)

最佳答案

您的回调类型签名错误;你忘记了结果类型。当函数退出时,它也会收集垃圾;你需要让它全局化。

您的 GetStatus 调用缺少参数 pArg。另外,在使用指针时,您需要定义 argtypes,否则在 64 位平台上会出现问题。 ctypes 的默认参数类型是 C int

from ctypes import * 

api = CDLL('API.dll')
StatusCB = WINFUNCTYPE(None, c_int, c_int, c_void_p)

GetStatus = api.GetStatus
GetStatus.argtypes = [StatusCB, c_void_p]
GetStatus.restype = None

def status_fn(nErrorCode, nSID, pArg):
print 'Hello world'
print pArg[0] # 42?

# reference the callback to keep it alive
_status_fn = StatusCB(status_fn)

arg = c_int(42) # passed to callback?

def start():
GetStatus(_status_fn, byref(arg))

关于python - 在 C 中为函数指针回调函数编写 Python ctypes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17980167/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com