【发布时间】:2015-01-03 00:46:55
【问题描述】:
很长一段时间以来,我都尝试使用带有LVIF_TEXT 掩码的LVM_GETITEMW 消息来获取ListView 的文本。我的程序在 32 位架构下工作,但在 64 位架构下不工作。
我发现问题出在LVITEM 结构上。很快,我的问题是哪个结构适合 64 位以及为什么。
我用作LVITEMW 结构的结构具有以下字段:
('mask', c_uint32),
('iItem', c_int32),
('iSubItem', c_int32),
('state', c_uint32),
('stateMask', c_uint32),
('pszText', c_uint32),
('cchTextMax', c_int32),
('iImage', c_int32),
('lParam', c_uint64),
('iIndent', c_int32),
('iGroupId', c_int32),
('cColumns', c_uint32),
('puColumns', c_uint32),
('piColFmt', c_int32),
('iGroup', c_int32)
(用python 2.7 ctypes编写,但这只是一种写作形式——语言真的无关紧要)。
这些字段就像documented。
经过大量谷歌搜索,我找到了这个forum,它正是我需要的——64 位解决方案!
所以在 64 位中,结构应该有更多的“空格”,并且应该看起来像这样(指针现在是 64 位,stateMask 也是 64 位。这与论坛建议的有点不同,但是也可以):
('mask', c_uint32),
('iItem', c_int32),
('iSubItem', c_int32),
('state', c_uint32),
('stateMask', c_uint64), <-- Now 64 bit
('pszText', c_uint64), <-- Now 64 bit which makes sense since this is a pointer
('cchTextMax', c_int32),
('iImage', c_int32),
('lParam', c_uint64),
('iIndent', c_int32),
('iGroupId', c_int32),
('cColumns', c_uint32),
('puColumns', c_uint64), <-- Now 64 bit which makes sense since this is a pointer
('piColFmt', c_int64), <-- Now 64 bit which makes sense since this is a pointer
('iGroup', c_int32)
论坛建议:
('mask', c_uint32),
('iItem', c_int32),
('iSubItem', c_int32),
('state', c_uint32),
('stateMask', c_uint64),
('pszText', c_uint64),
('cchTextMax', c_int32),
('iImage', c_int64), <-- Now 64 bit
('lParam', c_uint32),
('iIndent', c_int32),
('iGroupId', c_int32),
('cColumns', c_uint32),
('puColumns', c_uint32),
('piColFmt', c_int32),
('iGroup', c_int64), <-- Now 128 bit all together
('iGroup2', c_int64) <-- continuation
这也适用,在我需要的列表中是 pszText 指向的文本。
我的问题是:
- 这是否记录在任何地方?
- 为什么
stateMask应该是c_uint64- 它不应该总是和state一样大吗? - 哪个是真正的 64 位结构?
谢谢!
【问题讨论】:
-
不要平台垃圾邮件。这和 C# 有什么关系?
-
我可能会删除 C# 标签并添加 win32,因为这是一个 win32 API 问题 IMO。
-
这些字段与您找到的 MSDN 页面上的记录相同。您需要将 Win32 ABI 翻译成 Python。您缺少的细节是 Win32 ABI 使用 8-byte packing。
-
@RaymondChen 另一个问题:为什么文档说 puColumns 和 piColFmt 是 UINT 和 INT 虽然它也说它们是指针? (pszText 也是一个指针,它是一个 LPTSTR,它是一个 WCHAR * 或一个 CHAR *)
-
这是一个文档错误。我会看看我能做些什么来修复它。
标签: windows winapi 64-bit pywin32 win64