我目前正在调查python和C-dll之间的接口。 使用ctypes库,我可以加载DLL。
我有一个非常简单的软件设置来进行概念验证: 我在DLL中调用的函数需要1个参数;函数指向函数的函数,该函数接受由python代码打印的字符串。
Python代码:
lib = ctypes.WinDLL(LIB_PATH)
# 1) Create callback function type
CB_FUNC_TYPE = ctypes.CFUNCTYPE(None, ctypes.c_char_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p)
# 2) Create the function which will be called back
def foo(text):
print text
# 3) create ctype callback function
cb_func = CB_FUNC_TYPE(foo)
# 4) Call the function
print lib.Test2(cb_func)
导出C函数(Test2):
__declspec(dllexport) void Test2(T_LOG_CALLBACK pf_log)
{
pf_log("Hello Python Log function!);
return;
}
执行python代码时,我收到以下错误输出消息:
Hello Python Log function!
Traceback (most recent call last):
File "C:\version\vcs\py\workspace\workspace\tests\python-c integration\test.py", line 32, in <module>
print lib.Test2(cb_func)
ValueError: Procedure probably called with too many arguments (4 bytes in excess)
这意味着回调被正确执行,但是已经触发了堆栈错误。
我不明白错误,因为c函数只有一个参数(在这种情况下函数指针指向函数foo)。
如果我更新该行:
cb_func = CB_FUNC_TYPE(foo)
到
print lib.Test2(cb_func, "extra")
我得到了相同的错误,但超出了8个字节:
Hello Python Log function!
Traceback (most recent call last):
File "C:\version\vcs\py\workspace\workspace\tests\python-c integration\test.py", line 32, in <module>
print lib.Test2(cb_func, "extra")
ValueError: Procedure probably called with too many arguments (8 bytes in excess)
我找不到错误,因为我至少需要添加回调函数的地址。
任何人都可以看到我做错了什么?
答案 0 :(得分:0)
这可能偏离基础,但我认为你需要为每个ctypes函数定义一个argtype和restype ..