我在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代码?
答案 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