Print This Post Дорабатываем DLL для LastFM

Понедельник, 3. Октябрь 2011
Раздел: Assembler, C/C++, Windows, автор:

Как оказалось, библиотека для LastFM из статьи от 31.08.11 оказалась не особо юзабельной из-за нескольких досадных недоработок:
1. Клавиши управления не работали, если окно свернуто (связано с тем, что управление производилось с помощью SendMessage, но в свернутом состоянии окно не обрабатывает оконные сообщения, поэтому они переставали реагировать). (Спасибо Artik'у за наводку)
2. При сворачивании окна в трей и последующем восстановлении пропадали элементы управления, так как окно "уничтожалось".

Чтобы исправить эти моменты, я решил переписать библиотеку. В этой статье я опишу изменившиеся методы (к слову, CreateThumbnailToolbar и EnumWindowsProc остались без изменений).

Итак, начнем с глобальных переменных, которые пришлось добавить:

Теперь несколько новых функций:

Теперь о том, как я нашел процедуру обработки и определил, какие методы из неё меня интересуют. Нажимаем кнопку Play в свежеустановленном LastFM, получаем сообщение о невозможности продолжить проигрывание, открываем клиент LastFM в отладчике (я пользовался OllyDbg), ищем все строки, упомянутые в секции кода текущего модуля (Search for -> All referenced text strings), находим текст сообщения.

Переходим в функцию, которая ссылается на эту строку, ищем, откуда эта функция вызывается, и находим процедуру, в которой обрабатываются все интересующие нас события.

Остается "потыкать" на интересующие нас кнопочки и определить, какие функции вызываются при их нажатии. Адреса получились следующие:

Теперь перепишем процедуру WndProc, чтобы избавиться от проблемы №1.

Почему я использую статичные смещения для вызова функций? Во-первых, у клиента LastFM отсутствует секция релокаций, а следовательно, он будет грузиться по смещению, указанному в ImageBase.

Во-вторых, клиент довольно редко обновляется, что продлевает актуальность этой надстройки.
Наконец, остается решить проблему №2 - сделать, чтобы кнопки управления восстанавливались после закрытия и повторного открытия окна. Для этого проще всего создать таймер, который будет проверять видимость главного окна и восстанавливать кнопки управления.

И последняя измененная функция - DllMain:

Исходный код и скомпилированная DLL: скачать

 Обсудить на форуме


Получать обновления на почту:     

Комментариев: 4 к “Дорабатываем DLL для LastFM”


  1. Artik :

    Спасибо)
    Кстати, радио можно слушать бесплатно и в других странах, достаточно скачать старый клиент скробблера.
    Например отсюда: http://rutracker.org/forum/viewtopic.php?t=3737124

    [Ответить]

    Kaimi:

    Надо будет посмотреть в чем разница старого и нового клиента, возможно удастся для нового клиента сделать патч или DLL для бесплатного прослушивания в нём.

    [Ответить]

    _:

    Было бы неплохо, хотя в принципе различий между новым и старым клиентом почти никаких.

    [Ответить]

    50z:

    http://habrahabr.ru/post/145318/

    [Ответить]


Оставьте ваш комментарий