【发布时间】:2016-07-13 21:42:10
【问题描述】:
考虑下面的 Python
>>> from ctypes import *
>>> from ctypes.wintypes import *
>>> class _Filename(Structure):
... _fields_ = [("NameLengthInBytes", USHORT),
... ("Name", WCHAR * 1)]
...
>>> req = create_string_buffer(20)
>>> preq = cast(req, POINTER(_Filename))
>>> req
<ctypes.c_char_Array_20 object at 0x0000000002038DC8>
>>> preq.contents
<__main__._Filename object at 0x0000000002038EC8>
>>> preq.contents.NameLengthInBytes = 10
>>> memmove(preq.contents.Name, u"ABCDE", 10)
31932464L
>>> memoryview(req).tobytes()
'\n\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> preq.contents.Name=u"Z"
>>> memoryview(req).tobytes()
'\n\x00Z\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
我很困惑。我希望 preq 的 contents 的地址与 req 相同。至少我认为 cast 会这样做。
我想要做的是创建一个连续的内存块,其中包含 NameLengthInBytes 后跟一个任意长度的宽字符串。我想编写代码,使其依赖于 _Filename 的字段名称,以便如果 _Filename 的定义发生更改(例如通过在名称之前添加一个额外的字段)代码仍会复制到正确的缓冲区位置。
谁能帮助我了解 Python 和 ctypes 如何直接操作内存以及如何实现我想要的目标?
谢谢。
【问题讨论】:
标签: python-2.7 ctypes