LVITEM для Windows 64 бит
Долгое время я пытался использоватьLVM_GETITEMW
сообщение сLVIF_TEXT
маска для получения текста 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, но это всего лишь форма письма - язык действительно не имеет значения).
Эти поля так же, какдокументированный.
После долгих поисков я нашел этоФорум который имел именно то, что мне было нужно - 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-битной?Спасибо!