【发布时间】:2016-11-13 18:48:05
【问题描述】:
Python 版本
Python 3.5.2
问题
当我尝试使用 ctypes 调用 C DLL 时,我注意到了这个问题,C 函数类似于:
MEASURE_API int InitTester(char *ipAddress)
所以我需要将 IP 地址字符串(例如,192.168.100.100)从 Python 传递给 ctypes,根据 Python 3.5 的 ctypes doc,我尝试了 c_wchar_p 和 c_char_p,但它们都不起作用,我从 c dll 端重新运行错误代码。我对这个 dll 进行了一些其他函数调用,传递了 c_int、c_void_p、c_bool 和其他数据类型,这些都可以。回溯,发现 c_wchar_p 和 c_char_p 返回结果的行为与基于 ctypes doc 的行为不同。来自 Python 3.5 的 ctypes 文档:
>>> c_wchar_p("Hello, World")
c_wchar_p('Hello, World')
它返回 ctypes 字符串。 但我在 Python 控制台中执行相同 cmd 的结果:
>>> from ctypes import *
>>> c_wchar_p("Hello, World")
c_wchar_p(1374004842736)
>>> c_wchar_p("Hello, World")
c_wchar_p(1374004841680)
>>> c_wchar_p("Hello, World")
c_wchar_p(1374004842736)
所以看起来原来的字符串部分可能变成了内存地址。深入挖掘,发现它是否是 Python 2.x(默认编码为 ASCII),然后返回显示字符串,如 Python 3.5 ctypes doc 所示。但在 Python 3.x(默认编码为 UTF-8)中,它总是返回数字,行为与文档不同。在多台电脑上检查。并理解了我们可以使用 .value 返回原始字符串的部分。但它不能传递给必须是 ctype 的 C 函数。
问题
- 谁能提供关于行为 ctypes 的解释?
- 以及如何解决这个问题,以便在 Python3.5 中获得与 ctype doc 相同的行为,然后使 call c dll 工作?
先谢谢了~
【问题讨论】:
-
错误是什么?您是否尝试过使用
create_string_buffer?它不是constarg 的事实表明您需要传递一些允许变异的东西,这就是create_string_buffer似乎所做的。
标签: python python-2.7 python-3.x dll ctypes