Выгрузка плагина Winamp'ом

Тема в разделе "Разработка плагинов", создана пользователем Twister, 15 янв 2008.

  1. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Доброго всем времени суток.

    Мой вопрос адресован тем, кто занимался разработкой плагинов для Winamp. Я уже задал его на родном форуме (forums.winamp.com), но в течение долгого времени ответа так и не получил.

    Фишка вот в чем: написал я плагин на делфях (без RTL, как завещал ms-rem), соблюдая все каноны - DLL экспортирует одну функцию winampGeneralPurposePlugin, DLLEntry возвращает в eax 1h, имя самого файла начинается с 'gen_'. Плагин грузится Winamp'ом, но сразу после того, как отрабатывает DLLEntry, выгружается.

    Сначала я подумал, что что-то в моей DLL'ке не нравится не Winamp'у, а функции LoadLibrary, но как показали тесты, с ней все в поряде и либу выгружает сам Winamp. Просмотрев несколько примеров и отдизасмив парочку рабочих плагинов я не нашел разницы с моей реализацией - везде соблюдаются всё те же каноны. В итоге пришлось написать две библиотеки, одна из которых является loader'ом и грузит вторую либу, которая и несет весь функционал. Но как-то это черезжопно...

    Вот сейчас сижу и чешу репу - что не нравится Winamp'у? Может кто сталкивался с такой проблемой?
    Сам плагин с сорцами можно слить со странички http://twister.orgfree.com/other, файл называется plugin.rar (38kb)

    Всем откликнувшимся заранее спасибо.
     
  2. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    del
    ну надо же хранить 2 файла с одинаковым именем?!
    вот прямая ссылка ;)
    http://twister.orgfree.com/other/Plugin.rar
     
  3. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    В DllEntry не надо делать логику. Для этого есть спец функция экспортируемая плагином.
    В SDK все логично:
    Код (Text):
    1. BOOL WINAPI _DllMainCRTStartup(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
    2. {
    3.     return TRUE;
    4. }
    А у тебя:

    Код (Text):
    1. hwndWinamp := FindWindow('Winamp v1.x', nil);
    2.   if hwndWinamp <> 0 then
    3.     begin
    4.     InitFPU();
    5.     hwndPlayList := SendMessage(hwndWinamp, WM_WA_IPC, IPC_GETWND_PE, IPC_GETWND);
    6.     if hwndPlayList <> 0 then
    7.       begin
    8.       HookProc('User32.dll', 'TrackPopupMenu', @NewTrackPopupMenu, @OldTrackPopupMenu);
    9.       PE_WndProc := SetWindowLong(hwndPlayList, GWL_WNDPROC, DWORD(@NewPEWindowProc));
    10.       end;
    11.     end;
    12.   end;
     
  4. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Прямые ссылки не качаются проводником с orgfree.com
    Погодь. И что, из-за этого Винамп выгружает плагин?
     
  5. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Все. Разобрался.

    Дело не в DLLEntry - там может быть что угодно.
    Просто в структуре, возвращаемой winampGetGeneralPurposePlugin должен присутствовать валидный указатель на процедуру инициализации. Та, в свою очередь должна возвращать ноль.

    Если кому надо, то обновленный плагин с сорцами по прежнему адресу. Суть его в том, что он дает возможность копировать файлы треков прямо из плейлиста. Это удобно для обновления музыки на MP3-флешке.

    Кстати, еще вопросик.
    Я добавляю свой пункт меню к всплывающему меню плейлиста динамически, путем перехвата TrackPopupMenu. Но как отличить это меню от других, что вызываются щелчками по кнопкам на окне плейлиста? По координатам мыши не прокатит - некоторые менюшки при стандартном скине всплывают в RECT'е списка треков. Есть какие идеи?
     
  6. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Twister
    Может стоит почитать SDK \ посмотреть примеры?
     
  7. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    может то оно может, но в данной модели плагинов предусмотрена спец. функция инициализации плагина (как и финализации)
    Вот на всякий случай структура, на которую должна быть ссылка после отработки функции winampGetGeneralPurposePlugin
     
  8. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    К чему ты это? SDK есть и я его курил. Как видишь - с вопросом разобрался.
    Она есть - глянь в сорцах.

    Так что по поводу второго вопроса? Есть мысли?
     
  9. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    По hMenu пройтись по Items и посмотреть текст или ID и по ним идентифицировать меню.
     
  10. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    530
    Адрес:
    Russia
    Twister
    про меню:
    наверн имеет смысл в начале вызвать меню, тут же вылезет твой хук, ты будешь знать, что это ты сам его вызвал - сохраняешь хэндл меню, меню не показываешь (т.к. ты его показал только для теста). потом просто сравниваешь хэндлы меню.
     
  11. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Это была первая мысль. Но я ее отклонил - Winamp может быть на любом языке. Кол-во итемов в меню тоже не показатель - может смениться при следующей версии или кто-то, как я, может добавить свои пункты.
    А вот на ID, наверное, стоит обратить внимание. Дома сравню версии старше 5,2...

    Jupiter
    Что-то я не совсем понял, что ты имеешь ввиду.
    А какое меню мне вызывать? ;) Я ж не знаю его хэндл - в том-то и проблема.
     
  12. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    530
    Адрес:
    Russia
    не по хэндлу, а по команде через SendMessage, как если бы был сделан клик в меню плейлисте. хэндл плейлиста тебе известен, вот и шли ему WM_CONTEXTMENU. кста ты можешь захучить (1 раз в начале) WM_INITMENUPOPUP, потом расхучить обратно.
    так понятнее?
     
  13. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Идею Jupiter'a реализовать не вышло - какие бы сообщения на стадии загрузки плагина не посылались окну плейлиста (WM_RBUTTONUP, WM_CONTEXTMENU), меню всегда всплывало не то, которое нужно, а главное меню Winamp'a. Но сама идея натолкнула меня на другую мысль (ну почему хорошие мысли всегда приходят поздно и только после хорошей травы?).

    Все до ужаса тупо - хук TrackPopupMenu должен добавлять свой пункт только в том случае, если меню было вызвано с помощью сообщения WM_RBUTTONUP, т.к. это сообщение единственный способ вызвать нужное меню.

    На этом всем откликнувшимся спасибо.
    Если кому нужно, то обновленные сорцы по старому адресу.
     
  14. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    530
    Адрес:
    Russia
    Twister
    оч. важно подтолкнуть в нужном направлении ;)

    работает, когда меню выло вызвано нажатием на клавишу на клаве "контекстное меню" ?
     
  15. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Нет, всплывает главное меню винампа...