windll ctypes从python 2.7调用variadic c函数在win64中工作但在win32中不起作用

时间:2018-05-17 08:05:01

标签: python windows ctypes 32bit-64bit variadic-functions

我在Windows 10-32和Windows 10-64上使用Python 2.7。

我正在为C编译的stdcall(Windows)DLL(= mydll)编写一个python包装器。我有两个版本的DLL - 32和64位。 64版本使用windll.mydll很有效。 对于DLL上的所有函数,32版本使用相同的命令工作得很好,除了变量printf之类的函数。

运行mydll.myvarfunc("Hello")

我明白了 ValueError: Procedure probably called with too many arguments (4 bytes in excess)

有没有办法绕过这个不涉及改变可变参数函数的C代码?

1 个答案:

答案 0 :(得分:1)

在Win64上,只有一个ABI,因此WinDLL和CDLL没有区别。在Win32上,可变参数函数始终为__cdecl,因此WinDLL使用了错误的调用约定。

解决此问题的一种方法:

import ctypes
stdcall_func = ctypes.WinDLL('mydll').stdcall_func
cdecl_func = ctypes.CDLL('mydll').cdecl_func