И снова ListView...

Тема в разделе "WASM.WIN32", создана пользователем psu, 12 июл 2006.

  1. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    Привет всем
    Проблема в следующем. Необходимо получить текст ячеек из ListView другого процесса. Алгоритм прост: найти дескриптор обьекта списка в нужном процессе, получить количество элементов, в цикле посылать сообщение LVM_GETITEMTEXT. Естественно, память под LVITEM и буфер для текста ячейки выделена через VirtualAllocEx, работа со структурой через WriteProcessMemory и ReadProcessMemory. Во вложенном цикле изменяю LVITEM::iSubItem от 0 до <количество_колонок>. Так вот, кроме текста, соответствующего 0-й колонке ( то есть iSubItem = 0 ), ничего получить не удается; для iSubItem > 0 SendMessage возвращает 0, буфер для текста пуст. В чем здесь проблема?

    ЗЫ. Код работает на другом списке того же процесса
    ЗЗЫ. Первый список имеет некоторые отличия от второго в стилях: LVS_SHOWSELALWAYS, LVS_NOLABELWRAP, LVS_FULLROWSELECT, а также одна из колонок содержит рисунок, а не текст

    Спасибо.
     
  2. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    Попробовал внедрить длл в процесс. Результат тот же: для 0-й колонки текст есть, для остальных - пусто
     
  3. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    psu
    Тогда однозначно с размером параметра напортачил. 0 он всегда 0, что слово, что двойное.
    А вот если нужно двойное, а ты задал просто - будет мусор тащить. В одном месте попал на границу двойного слова и работает, а в другом тебе не повезло.
     
  4. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    исключено, не первый раз пишу ;)

    Такая, значит, штука выяснилась... ( попрошу знатоков не камняться бросами ) Этот ListView имеет стиль LVS_OWNERDRAWFIXED. Попробовал поиграться с хуками. Перехватывал как WH_CALLWNDPROС, там и WH_CALLWNDPROCRET; проверял только WM_DRAWITEM, соответственно для данного списка DRAWITEMSTRUCT::itemData содержит указатель на LVITEM. Но в LVITEM::mask ничего похожего на стандартные маски нету, 6-значные числа...
    В чем ошибка?
     
  5. psu

    psu New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    198
    ура!
    все решилось

    Зассказываю, кому интересно.
    ошибка в том, что DRAWITEMSTRUCT::itemData указывает на уникальную для каждого частного случая структуру. В мое случае нужно было получить данные из eMule, а именно, о расшаренных файлах и их статистике. Формат данных, хотя и не полностью ( нет необходимости ) , разобрал с помощью олли дебагера

    ЗЫ. Кстати, на ту же структуру указывает и lParam из LVITEM ( можна использовать LVM_GETITEM с маской LVIF_ PARAM )
    ЗЗЫ. Почти монолог получился :)