使用CFUNCTYPE时,“可能使用过多参数调用过程”错误

时间:2013-10-01 14:37:10

标签: python-2.7 ctype

我目前正在调查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)

我找不到错误,因为我至少需要添加回调函数的地址。

任何人都可以看到我做错了什么?

1 个答案:

答案 0 :(得分:0)

这可能偏离基础,但我认为你需要为每个ctypes函数定义一个argtype和restype ..