如何解决关于python ctypes模块的问题
只是想根据 https://docs.python.org/3.8/library/ctypes.html 上的官方文档了解 python ctypes 并尝试一下
一切正常,直到:
当您使用 cdecl 调用约定调用 stdcall 函数时会引发 ValueError,反之亦然:
>>> cdll.kernel32.GetModuleHandleA(None)
Traceback (most recent call last):
File "<stdin>",line 1,in <module>
ValueError: Procedure probably called with not enough arguments (4 bytes missing)
>>>
>>> windll.msvcrt.printf(b"spam")
Traceback (most recent call last):
File "<stdin>",in <module>
ValueError: Procedure probably called with too many arguments (4 bytes in excess)
>>>
引自官方文档,而我得到的是:
>>> cdll.kernel32.GetModuleHandleA(None)
1374486528
>>> windll.msvcrt.printf(b"spam")
4
根据那些 MS 文档,这些函数调用似乎工作正常
此外,我还试图弄乱参数编号以引发 ValueError,但这就是我得到的:
>>> cdll.kernel32.GetModuleHandleA(None,0)
1374486528
>>> windll.kernel32.GetModuleHandleA(0,0)
1374486528
>>> windll.kernel32.GetModuleHandleA()
0
>>> cdll.kernel32.GetModuleHandleA()
0
似乎最后两个函数调用确实返回 null,因为有错误,但没有 Value 错误异常。 我得到的唯一错误是 OSError,正如文档示例所示。
谁能解释一下?我使用 conda 创建虚拟环境,并在 python 3.6.12 和 python 3.8.5 中测试这些代码。
顺便说一下,根据文档:“当您使用 cdecl 调用约定调用 stdcall 函数时会引发 ValueError,反之亦然”,我想知道“使用 cdecl 调用约定调用 stdcall 函数”究竟是什么意思?也许只是通过提供不同数量的参数而不是所需的函数?
解决方法
__stdcall
和 _cdecl
在 64 位编译器上没有区别。只有一种调用约定,符号被忽略,WinDLL 和 CDLL 都可以工作。 32 位代码很重要,必须使用正确的代码。
如果您希望脚本在 32 位和 64 位 Python 上正常工作,您仍然应该在脚本中使用适当的 WinDLL 或 CDLL。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。