Windll ctypes 从 python 2.7 调用可变参数 c 函数在 win64 中有效,但在 win32 中无效

2023-12-11

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

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

跑步时mydll.myvarfunc("Hello")

I get ValueError: Procedure probably called with too many arguments (4 bytes in excess)

有没有一种方法可以解决这个问题,而不涉及更改可变参数函数的 C 代码?


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

解决这个问题的一种方法是:

import ctypes
stdcall_func = ctypes.WinDLL('mydll').stdcall_func
cdecl_func = ctypes.CDLL('mydll').cdecl_func
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windll ctypes 从 python 2.7 调用可变参数 c 函数在 win64 中有效,但在 win32 中无效 的相关文章

随机推荐