AIMP Forum
AIMP for Windows => Дополнения / Addons => Разработка / Development => Topic started by: cherrybeach on February 19, 2010, 22:47:49
-
Вопрос состоит в следующем: как передать путь\список путей к треку\трекам
из другого процесса для их проигрывания в AIMP?
Я, имея опыт такого решения для Winamp и изучив примеры в AIPM SDK,
решил делать так:
1. Создаю file mapping (ну там как обычно через винодовские функции OpenFileMapping и MapViewOfFile)
2. заполняю этот mapping null-terminated строками - путями к файлу\файлам
3. мой AIPM-плагин читает из этого мапинга эти строки и грузит в AIPM
примерно как я видел в одном из примеров типа такова:
// это все чисто схематически конечно
AAIMPClassic.AIMP_NewStrings(AStrings);
for i:= 0 to N do begin
AStrings.AddFile(pWideChar(WideString(тут типа указатель на строку из мапинга
end;
APlsID := AAIMPClassic.AIMP_PLS_New('Default');
AAIMPClassic.AIMP_PLS_Clear(APlsID);
AAIMPClassic.AIMP_PLS_AddFiles(APlsID, AStrings);
APlayer.PlayTrack(APlsID, 0); //Начинаем играть с первого трека
НО!
Изучив далее примеры из SDK я обнаружил пример проекта AIMP_RemInfo (в файле sdk_remote_info.zip)
где передается информация о треке из процесса AIPM в процесс примера через мапинг.
Вот я и подумал - может я изобретаю вилосипед ???
Может AIPM уже имеет специальный маппинг для загрузки треков\плейлистов ???
Т.е. анагоичный как в примере AIMP_RemInfo только в другую сторону?
В примерах я таково не нашел.
А может есть другие механизмы? Не через мапинг?
Что посоветуете ???
Заранее спасибо.
-
Боюсь, что никак.
Разве что сгенерировать плейлист и передать его через командную строку (ключи см. в справке).
Вопрос - зачем нужно передавать из другого процесса плейлист? Какая именно цель приследуется?
-
Дело в том что я хочу сделать поддержку AIMP для вот этой вот штуки http://www.cherryware.org/mg/ (http://www.cherryware.org/mg/) (я являюсь ее разработчиком).
Неужели нельзя сделать как я описал - через плагин и file mapping?
-
Через плагин, естественно, можно сделать, но это лишняя прослойка.
Про маппинг - на данный момент ничего не скажу, возможно, в будущем сделаю...
-
Ну вобщем я проблему решил.
С использованием плагина, конечно, но не через маппинг!.
Т.е. без доп. прослойки.
Если кому интересно, сегодня-завтра сделаю пример и выложу здесь.
Хотелось бы услышать мнение народа. Vox populi так сказать.
-
Очень интересно. Выкладывай ))
-
Всем привет!
Как и обещал, привожу пример.
Пример - рабочий!
Проект плагина называется aimp_addon.dpr
Проект клиента называется aimp_client.dpr
Для передачи данных (в нашем случае строк) между процессами можно использовать
механизм сообщений WIndows. А именно сообщение WM_COPYDATA.
Суть в том, что Windows копирует данные из одного процесса в адресное пространство
другого процесса и передает указатель на скопированные данные Посредством SendMessage.
Вернее не указатель, а указатель на дескриптор, в котором содержится указатель
на скопированные данные. Но это не принципиально. Главное - мы можем получить валидный указатель.
Нашему процессу (в примере это плагин к AIMP-у) достаточно лишь получить такое
сообщение и прочитать из него все что нужно.
Чтобы наш плагин AIMP получал интересующее нас сообщение, я использовал хук.
Распространяццо не буду - Смотрите пример. Там все просто.
Узкое место в примере - это идентификация "наших" данных.
Как показали лабороторные опыты, AIMP кроме нашего сообщения WM_COPYDATA получает
и другие такие же сообщение WM_COPYDATA. И нам необходимо их как то фильтровать.
Я использовал уникальный идентификатор при передачи сообщения (параметр wParam),
который затем проверялся в плагине
В приложении:
EXAMPLE_MESSAGE_ID = $ABCDEF; // - уникальный идентификатор
SendMessage(AIMPInstance, WM_COPYDATA, EXAMPLE_MESSAGE_ID, Cardinal(@Data));
в плагине
if (hookStruct.wParam = EXAMPLE_MESSAGE_ID) ...
Интересно было б узнать мнение разработчиков AIMP касательно такова метода идентификации.
Насколько он надежен? Какие значения можно использовать в качестве EXAMPLE_MESSAGE_ID
штоб не пересечься c AIMP?
Я на всякий случай в своем приложении буду использовать несколько иной метод.
Более геморойный, но надежный.
Приглашаю пипл к обсуждению!
Консруктивная критика приветствуется!
-
Главное замечание:
Не надо вешать хуки на окна АИМП - это стремно.
Лучше создайте "свое" окошко и шлите сообщения ему, он легким образом их получит, даже проще, чем вешать хук.
EXAMPLE_MESSAGE_ID
Лучше его зарегистрировать через специальную функцию: RegisterWindowMessage()
Соответственно, и клиент, и сервер получат один и тот же ID
-
Спасибо. Учту.