AIMP Forum

AIMP для Windows => Дополнения (Plugins / Skins) => Плагины => Topic started by: Append on February 07, 2018, 21:33:17

Title: Проблема с плагином(плагинами)
Post by: Append on February 07, 2018, 21:33:17
Собрал плагин и разослал знакомым для проверки, но у них он не определился. Проверил на своем втором компьютере - та же проблема. На первом компьютере, на котором собирался плагин данной проблемы нет.
Пока понял что точка входа DllMain не вызывается. Пишу плагин на основе сурцов плагинов от AdrianEddy (https://github.com/AdrianEddy), скомпилировал его плагины и такая же проблема на первом компьютере работает, а на остальных нет.
1ПК - Win10 64 - 4.50, 2058
2ПК - Win10 64 - 4.50, 2058
3ПК - Win10 32 - 4.50, 2058
4ПК - Win7   64 - 4.50, 2058

В %appdata%/AIMP/AIMP.ini выставил следующие параметры:
[Plugins]
aimp_Pluginname.dll=0

[Plugins.CachedInfo]
aimp_Pluginname.dll=0|||||1279768328
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on February 07, 2018, 21:36:03
Да скорее всего у вас плагин собран с VC++ Runtime Libraries, которых нет на целевых машинах
Title: Re: Проблема с плагином(плагинами)
Post by: Append on February 07, 2018, 22:03:07
Не помогло. И еще скачал отсюда плагин Youtube от AdrianEddy, он определился(без установки VC++ Runtime Libraries), а мой собранный из его сурцов, которые я скачал с гитхаба как я писал выше - не определяется.

И тут проблема опять с SDK
\sdk\apiplaylists.h(150): error C3861: _T: идентификатор не найден
\sdk\apiplaylists.h(151): error C3861: _T: идентификатор не найден
\sdk\apiplaylists.h(152): error C3861: _T: идентификатор не найден
AdrianEddy это просто закоментировал
https://github.com/AdrianEddy/AIMPYouTube/blob/master/SDK/apiPlaylists.h#L143-L144
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on February 07, 2018, 22:08:35
Приложите плагин, посмотрю, "чем он хуже"
Title: Re: Проблема с плагином(плагинами)
Post by: Append on February 07, 2018, 22:22:58
Вот
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on February 08, 2018, 11:11:47
Собственно, как я и сказал - плагин тянет за собой MSVCP140D.dll и VCRUNTIME140D.dll, проверяйте настройки компиляции проекта
Title: Re: Проблема с плагином(плагинами)
Post by: Append on February 09, 2018, 17:56:06
Да проблема была в настройках проекта, решилась сменой сменой конфигурации с дебага на релиз.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on February 09, 2018, 21:11:31
Есть ли возможность создать плейлист с несколькими группами? Что-то вроде этого:
<IAIMPFileInfo>.SetValueAsObject(AIMP_FILEINFO_PROPID_ALBUM, "Моя музыка");
<IAIMPPlaylist>.SetValueAsInt32(AIMP_PLAYLIST_PROPID_GROUPPING_OVERRIDEN, 1);
<IAIMPPlaylist>.SetValueAsObject(AIMP_PLAYLIST_PROPID_GROUPPING_TEMPLATE, "%A");
но данный метод не совсем подходит, так как при загрузке аудио-файла если в нем имеется тег альбома то aimp переписывает AIMP_FILEINFO_PROPID_ALBUM и в итоге имею множество групп:
Моя музыка:
Песня1
Песня2
AlbumName11:
Песня3
Моя Музыка:
Песня4
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on February 10, 2018, 12:57:31
Нет, а зачем? Что вы пытаетесь сделать?
Title: Re: Проблема с плагином(плагинами)
Post by: Append on February 10, 2018, 16:22:10
>Нет, а зачем?
Хотел сделать чтобы было как на первом скриншоте, а получаю то что на втором скриншоте.
>Что вы пытаетесь сделать?
Пытался сделать несколько групп в одном плейлисте, а не иметь несколько плейлист

(https://www.aimp.ru/forum/index.php?action=dlattach;topic=59013.0;attach=53320)
 (https://www.aimp.ru/forum/index.php?action=dlattach;topic=59013.0;attach=53321)
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on February 11, 2018, 10:20:05
Не понимаю, зачем эти группы в плейлисте? Эта штука должна отображаться в фононтеке. Посмотрите, как это выглядит в плагине для подкастов
Title: Re: Проблема с плагином(плагинами)
Post by: Append on February 11, 2018, 14:17:01
Quote
Не понимаю, зачем эти группы в плейлисте? Эта штука должна отображаться в фононтеке. Посмотрите, как это выглядит в плагине для подкастов
Хорошо, буду делать так.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on April 12, 2018, 15:11:22
@Артём, можете подсказать где задается название вкладки в фонотеке?
В примере на delphi я так понимаю в функции "function DoGetValueAsObject(PropertyID: Integer): IInterface; override;" ?
Если да то я не понимаю где и как осуществляется её вызов...

(https://www.aimp.ru/forum/index.php?action=dlattach;topic=59013.0;attach=53855)
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on April 12, 2018, 21:40:20
@Артём, можете подсказать где задается название вкладки в фонотеке?
В примере на delphi я так понимаю в функции "function DoGetValueAsObject(PropertyID: Integer): IInterface; override;" ?
Если да то я не понимаю где и как осуществляется её вызов...

(https://www.aimp.ru/forum/index.php?action=dlattach;topic=59013.0;attach=53855)

Code: [Select]
function TDemoExplorerViewDataStorage.DoGetValueAsObject(PropertyID: Integer): IInterface;
begin
  case PropertyID of
    AIMPML_DATASTORAGE_PROPID_ID:
      Result := MakeString('DemoExplorerViewID');
    AIMPML_DATASTORAGE_PROPID_CAPTION:
      Result := LangLoadStringEx('ExplorerView\Caption');
  else
    Result := inherited DoGetValueAsObject(PropertyID);
  end
end;

Вызов осуществляется плеером при регистрации расширения:

Code: [Select]
Core.RegisterExtension(IAIMPServiceMusicLibrary, TDemoExplorerViewDataStorage.Create);
Title: Re: Проблема с плагином(плагинами)
Post by: Append on April 12, 2018, 22:48:52
Вызов осуществляется плеером при регистрации расширения:
Code: [Select]
Core.RegisterExtension(IAIMPServiceMusicLibrary, TDemoExplorerViewDataStorage.Create);
Все разобрался только заметил что класс наследуются от TAIMPPropertyList, до этого бегло смотрел и показалось что там было IAIMPPropertyList... :(
Title: Re: Проблема с плагином(плагинами)
Post by: Append on April 21, 2018, 08:16:51
Как работает IAIMPMLGroupingTreeDataProviderSelection::GetValue(IAIMPString** FieldName, VARIANT** Value)?
Присвоил *FieldName значение типа *IAIMPString и *Value тоже присвоил *IAIMPString(указателю punkVal, значение vt = VT_UNKNOWN). В итоге после завершения функции не доходя до GetCapabilities(после исключения идет вызов этой функции) выпадает исключение из-за попытки прочитать память которая ссылается на 0.
(https://www.aimp.ru/forum/index.php?action=dlattach;topic=59013.0;attach=53940)
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on April 21, 2018, 10:23:18
Как работает IAIMPMLGroupingTreeDataProviderSelection::GetValue(IAIMPString** FieldName, VARIANT** Value)?
Присвоил *FieldName значение типа *IAIMPString и *Value тоже присвоил *IAIMPString(указателю punkVal, значение vt = VT_UNKNOWN). В итоге после завершения функции не доходя до GetCapabilities(после исключения идет вызов этой функции) выпадает исключение из-за попытки прочитать память которая ссылается на 0.
(https://www.aimp.ru/forum/index.php?action=dlattach;topic=59013.0;attach=53940)

*Value - должен быть указателем на структуру типа VARIANT. Интерфейс туда пихать нельзя
Title: Re: Проблема с плагином(плагинами)
Post by: Append on April 21, 2018, 10:45:32
*Value - должен быть указателем на структуру типа VARIANT. Интерфейс туда пихать нельзя
И какой тип помещать в структуру VARIANT?
Попробовал так:
VARIANT variant;
variant.vt = VT_BSTR;
variant.bstrVal = SysAllocString(OLESTR("Text"));
*Value = &variant;
Получаю такую же ошибку
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on April 21, 2018, 19:04:01
И какой тип помещать в структуру VARIANT?
Попробовал так:
VARIANT variant;
variant.vt = VT_BSTR;
variant.bstrVal = SysAllocString(OLESTR("Text"));
*Value = &variant;
Получаю такую же ошибку

не знаю, я не работал с Variant на С++, я думаю, стоит обратиться к справке по Ole.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on April 22, 2018, 14:52:28
не знаю, я не работал с Variant на С++, я думаю, стоит обратиться к справке по Ole.
Ну объясните хотя бы значение функции getvalue, за что отвечает первый и второй аргумент, ибо в документации вообще никакого описания.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on April 22, 2018, 18:38:54
Ну объясните хотя бы значение функции getvalue, за что отвечает первый и второй аргумент, ибо в документации вообще никакого описания.

Названия аргументов разве не говорят сами за себя? Я поэтому описание и не стал писать, посчитал, что и так все понятно. Первое - имя поля в таблице. Второе - значение этого поля для текущего узла дерева.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on April 23, 2018, 13:48:30
1)Ошибка была из-за того что в fieldname передавал название поля, которого не было. Возможно есть недочет в самом аимпе, например проверка на null, просто странно что считывает нулевой адрес.
2)IAIMPMLGroupingTreeDataProviderSelection::NextRow, в документации написана как NextRecord.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on April 24, 2018, 16:00:45
Названия аргументов разве не говорят сами за себя?
Хорошо...
1)FieldName - передаем те поля, которые заполнили в GetFields?
1.1)Передаем в порядке добавления не учитывая AIMPML_RESERVED_FIELD_DURATION, AIMPML_RESERVED_FIELD_ID, AIMPML_RESERVED_FIELD_FILENAME?
1.2)При дублировании что будет? Например два раза присвоил строку "Исполнитель".
2)Value - ЗАЧЕМ? ДЛЯ ЧЕГО?
2.1)Какими именно типами можно инициализировать экземпляр типа VARIANT чтобы после его присвоить в *Value?
2.2)Что будет если не присвоить значение в Value? У меня, если я оставляю *Value не инициализированной - вызываются методы класса, который я унаследовал от IAIMPMLGroupingTreeDataProviderSelection, экземпляр этого класса создал и передал в переменную *Data в методе GetData класса который наследуется от IAIMPMLGroupingTreeDataProvider.

Все поля:
case AIMPML_FIELDS_SCHEMA_ALL:
list->Add(CreateField(AIMPML_RESERVED_FIELD_ID, AIMPML_FIELDTYPE_STRING, AIMPML_FIELDFLAG_INTERNAL));
list->Add(CreateField(AIMPML_RESERVED_FIELD_FILENAME, 0, AIMPML_FIELDFLAG_INTERNAL));
list->Add(CreateField(L"Исполнитель", AIMPML_FIELDTYPE_STRING));
list->Add(CreateField(L"Название", AIMPML_FIELDTYPE_STRING));
list->Add(CreateField(AIMPML_RESERVED_FIELD_DURATION, AIMPML_FIELDTYPE_DURATION));
list->Add(CreateField(L"Битрейт", AIMPML_FIELDTYPE_INT32));
Прочитанная литература:
http://rsdn.org/article/com/varsafearr.xml
https://msdn.microsoft.com/en-us/library/windows/desktop/ms221627(v=vs.85).aspx
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on April 24, 2018, 19:13:01
Хорошо...
1)FieldName - передаем те поля, которые заполнили в GetFields?
1.1)Передаем в порядке добавления не учитывая AIMPML_RESERVED_FIELD_DURATION, AIMPML_RESERVED_FIELD_ID, AIMPML_RESERVED_FIELD_FILENAME?
1.2)При дублировании что будет? Например два раза присвоил строку "Исполнитель".
2)Value - ЗАЧЕМ? ДЛЯ ЧЕГО?
2.1)Какими именно типами можно инициализировать экземпляр типа VARIANT чтобы после его присвоить в *Value?
2.2)Что будет если не присвоить значение в Value? У меня, если я оставляю *Value не инициализированной - вызываются методы класса, который я унаследовал от IAIMPMLGroupingTreeDataProviderSelection, экземпляр этого класса создал и передал в переменную *Data в методе GetData класса который наследуется от IAIMPMLGroupingTreeDataProvider.

1. Да, естественно. Дерево группировки - это просто своеобразный вид фильтра таблицы.
  1.1. Вы про дерево? Или уже про таблицу? Для дерева это вообще неважно.
  1.2. Дубль останется без данных, т.к. биндинг идет по имени - движок найдет первую колонку и заполнит именно ее.
2. В смысле зачем? Это же фильтр - там идут пары Поле=Значение. Т.е. когда пользователь выбирает что-то в дереве, строится фильтр согласно выбранному узлу и (опционально) всем его родителям.
  2.1. Ровно тем, что вы указали при создании поля в AIMPML_FIELDS_SCHEMA_ALL
  2.2. Повторюсь, Value - это данные. Они придут обратно к вам в качестве фильтра для таблицы. Если вы напишите туда белеберду - она к вам обратно и придет.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on May 24, 2018, 18:56:11
В каких случаях вызывается IAIMPMLGroupingTreeDataProviderSelection::GetDisplayValue?
У меня из данного класса вызывается только метод GetValue.

Немного псевдокода:
GetFields добавил 6 полей: ID(string,internal), FILENAME(0,internal), "Исп."(string,0), "Наз."(string,0), Duration(Duration,0), "Бит."(int,0)
GetGroupingPresets добавил шаблон :
Presets->Add(UID, "Без группировки", 0, new TreeProvider(), &m_groupingPreset);
TreeProvider наследуется от IAIMPMLGroupingTreeDataProvider;
Дальше AIMP вызывает методы:
TreeProvider::GetFieldForAlphabeticIndex возвращаю E_FAIL;
TreeProvider::GetData: Selection.getcount возвращает 0, *Data = new TreeProviderSelection(), S_OK;
TreeProviderSelection наследуется от IAIMPMLGroupingTreeDataProviderSelection
TreeProviderSelection::GetValue: *FieldName = istr(где istr = "Исп."), *Value = var(где var = "Текст0");
TreeProviderSelection::GetCapabilities: возвращаю ...HIDEALLDATA | ...CAP_DONTSORT
TreeProvider::GetData: Selection.getcount возвращает 0, *Data = new TreeProviderSelection(), S_OK;
TreeProviderSelection::GetValue: *FieldName = istr(где istr = "Наз."), *Value = var(где var = "Текст1");
TreeProviderSelection::GetCapabilities: возвращаю ...HIDEALLDATA | ...CAP_DONTSORT
TreeProvider::GetData: Selection.getcount возвращает 0, *Data = new TreeProviderSelection(), S_OK;
TreeProviderSelection::GetValue: *FieldName = istr(где istr = Duration), *Value = var(где var = 50.0);
TreeProviderSelection::GetCapabilities: возвращаю ...HIDEALLDATA | ...CAP_DONTSORT
TreeProvider::AppendFilter: Selection.getcount возвращает 0, есть ли смысл добавлять фильтр если getcount = 0?
IAIMPMLDataProvider::GetData - с этим проблем нет.

Запили бы пример MusicLibrary с IAIMPMLGroupingPreset вопросов было бы меньше. А вообще есть ли расширения от сторонних разработчиков использующее IAIMPMLGroupingPreset или IAIMPMLGroupingPreset использует только Артем?
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on May 24, 2018, 20:55:21
Запили бы пример MusicLibrary с IAIMPMLGroupingPreset вопросов было бы меньше. А вообще есть ли расширения от сторонних разработчиков использующее IAIMPMLGroupingPreset или IAIMPMLGroupingPreset использует только Артем?

GetDisplayValue, GetImageIndex, GetFlags вызывается сразу после успешного вызова GetValue (с результатом S_OK)

Пример, видимо, придется делать, раз возникает столько вопросов. Пока могу лишь приложить кусок кода от когда-то рабочего плагина для VK
Title: Re: Проблема с плагином(плагинами)
Post by: Append on May 26, 2018, 11:19:54
virtual HRESULT WINAPI GetData(IAIMPMLGroupingTreeSelection* Selection, IAIMPMLGroupingTreeDataProviderSelection** Data) override {
         IAIMPString *FieldName = nullptr;
         VARIANT *Value = nullptr;

         if (SUCCEEDED(Selection->GetValue(0, &FieldName, &Value))) {
            /* . . . */
         }
         else
         {
            /*
            Value = new VARIANT;
            Value->vt = VT_BSTR;
            Value->bstrVal = SysAllocString(L"");*/
         }
         try {
            *Data = new TreeProviderSelection();
            return S_OK;
         }
         catch (const std::exception&) {
            return E_FAIL;
         }
      }

Run-Time Check Failure #2 - Stack around the variable 'FieldName' was corrupted.
Если FieldName и Value сделать как указатель на указатель то ошибки нет, но это скорее всего неправильно.
Если что Selection.GetCount() = 0.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on May 26, 2018, 19:43:40
Создал массив:
{ L"Моя музыка", L"", false, 1 },
{ L"Плейлисты", L"", false, 2 }
Где 1(DisplayValue) и 2(Value) строка юникод, 3 имеет ли подуровни, иконка.
Псевдокод:
TreeProvider = (TInterfacedObject, IAIMPMLGroupingTreeDataProvider)
TreeProviderSelection = (TInterfacedObject, IAIMPMLGroupingTreeDataProviderSelection)
AIMP вызывает методы:
TreeProvider ::GetData(): создаю экземпляр TreeProviderSelection: m_iterator = 0
TreeProviderSelection::GetValue: FieldName = "Category",
Value если оставить как есть то есть NULL то вызывается:
TreeProviderSelection::GetDisplayValue [m_iterator].DisplayValue
TreeProviderSelection::GetImageIndex [m_iterator].ImgIndex
TreeProviderSelection::GetFlags: AIMPML_GROUPINGTREENODE_FLAG_STANDALONE
TreeProviderSelection::NextRow(): m_iterator++, m_iterator < 2 => возвращается 1
Повторяется все это еще 2 раза, а дальше вызывается GetValue после NextRow и получаю исключение(обращение к NULL).
Если присваиваю значение Value в GetValue таким образом:
VARIANT *var = new VARIANT;
var->vt = VT_BSTR;
var->bstrVal = SysAllocString(m_templist[m_iterator].Value.c_str());
*Value = var;
То: GetData > GetValue > Еще два раза повторяется
и все дерево пустое.

Title: Re: Проблема с плагином(плагинами)
Post by: JD on May 26, 2018, 20:47:14
Run-Time Check Failure #2 - Stack around the variable 'FieldName' was corrupted.
Если FieldName и Value сделать как указатель на указатель то ошибки нет, но это скорее всего неправильно.
Если что Selection.GetCount() = 0.
Value должен быть объявлен как значение, а не указатель. Там ошибка в описании интерфейса, если не ошибаюсь.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on May 26, 2018, 21:06:17
Value должен быть объявлен как значение, а не указатель. Там ошибка в описании интерфейса, если не ошибаюсь.

Как должно быть?
Title: Re: Проблема с плагином(плагинами)
Post by: JD on May 26, 2018, 21:14:39
Как должно быть?
virtual HRESULT WINAPI GetValue(int Index, IAIMPString** FieldName, VARIANT* Value) = 0;

(второй параметр указатель на variant, а не указатель на указатель, как в sdk)
Title: Re: Проблема с плагином(плагинами)
Post by: JD on May 26, 2018, 21:17:08
такая же опечатка в методе IAIMPUIInputDialog::Execute, если явно преобразовать тип - всё работает
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on May 26, 2018, 21:24:25
Вот, попробуйте с этим файлом
Title: Re: Проблема с плагином(плагинами)
Post by: Append on May 26, 2018, 21:34:29
Вот, попробуйте с этим файлом
Помогло, но проблема с заполнением дерева осталась.
Title: Re: Проблема с плагином(плагинами)
Post by: JD on May 26, 2018, 21:55:06
Вот, попробуйте с этим файлом
боюсь, в IAIMPMLDataFilterGroup::Add должна быть передача по указателю - иначе падает.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on May 26, 2018, 23:19:58
боюсь, в IAIMPMLDataFilterGroup::Add должна быть передача по указателю - иначе падает.

Мда, странноватый бихевер у С++. Значит буду подправлять только по мере выявления.

Помогло, но проблема с заполнением дерева осталась.

Можете скинуть версию вашего плагина с логгированием?
Title: Re: Проблема с плагином(плагинами)
Post by: Append on May 27, 2018, 08:46:23
Проблема была в GetValue. Я переменной FieldName присваивал всегда один и тот же указатель ну и в какой-то момент AIMP его освободил... и переменная Value уже не NULL.
В общем пока все работает. Благодарю за помощь.
(https://www.aimp.ru/forum/index.php?action=dlattach;topic=59013.0;attach=54244)
Title: Re: Проблема с плагином(плагинами)
Post by: Append on May 29, 2018, 14:02:24
Новая проблема.
(https://www.aimp.ru/forum/index.php?action=dlattach;topic=59013.0;attach=54260)
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on May 29, 2018, 14:22:07
На какой именно строчке возникает эта ошибка? Там, где стоит фокус?
Title: Re: Проблема с плагином(плагинами)
Post by: JD on May 29, 2018, 14:22:51
Новая проблема.
Три поста назад то же самое обсуждалось же. Вариант надо передавать по указателю.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on May 29, 2018, 14:24:39
Три поста назад то же самое обсуждалось же. Вариант надо передавать по указателю.

В оригинале он там и есть по указателю.
Title: Re: Проблема с плагином(плагинами)
Post by: JD on May 29, 2018, 14:26:49
В оригинале он там и есть по указателю.
Автор вероятно использует уже поправленную декларацию, видно передачу по значению.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on May 29, 2018, 14:49:19
Автор вероятно использует уже поправленную декларацию, видно передачу по значению.
Да именно так... благодарю еще раз. А null как-нибудь можно передать во второе значение?
Quote
Значение 2. Используется только при AIMPML_FIELDFILTER_OPERATION = AIMPML_FIELDFILTER_OPERATION_BETWEEN.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on May 29, 2018, 21:24:13
Да именно так... благодарю еще раз. А null как-нибудь можно передать во второе значение?

так раз там указатель - передавайте просто nullptr
Title: Re: Проблема с плагином(плагинами)
Post by: Append on May 30, 2018, 12:30:51
так раз там указатель - передавайте просто nullptr
Я это сразу попробовал и мне выдало исключение - обращение к нулевому указателю.
Возможно в delphi Value == null тоже самое что value.vt == VT_NONE(||VT_NULL) в плюсах, а раз я кидаю нулевой указатель, то поле vt мы получить не можем т.к. обращаемся к нулю. Либо на вышей стороне нет проверки на null.
Title: Re: Проблема с плагином(плагинами)
Post by: JD on May 30, 2018, 16:12:48
Я это сразу попробовал и мне выдало исключение - обращение к нулевому указателю.
Возможно в delphi Value == null тоже самое что value.vt == VT_NONE(||VT_NULL) в плюсах, а раз я кидаю нулевой указатель, то поле vt мы получить не можем т.к. обращаемся к нулю. Либо на вышей стороне нет проверки на null.
пустой вариант передавайте
Code: [Select]
VARIANT Value2 = {};
Filter->Add(FieldName, &Value1, &Value2, ...
Title: Re: Проблема с плагином(плагинами)
Post by: Append on April 29, 2019, 19:03:09
Снова взялся за свой плагин...

(https://www.aimp.ru/forum/index.php?action=dlattach;topic=59013.0;attach=57405)

Можно ли сделать так чтобы в плейлисте от IAIMPMLDataProviderSelection использовались поля Artist и Title в качестве имени композиции, а не FileName или я делаю что-то не так?

Title: Re: Проблема с плагином(плагинами)
Post by: Artem on April 29, 2019, 19:41:21
Снова взялся за свой плагин...

Можно ли сделать так чтобы в плейлисте от IAIMPMLDataProviderSelection использовались поля Artist и Title в качестве имени композиции, а не FileName или я делаю что-то не так?

Для этого надо делать провайдер FileInfo для плейлиста и других частей программы.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on April 29, 2019, 20:08:45
Для этого надо делать провайдер FileInfo для плейлиста и других частей программы.

И как его использовать для фонотеки? В первой версии плагина просто вручную создавал плейлист и заполнял FileInfo, а как быть с фонотекой где плейлист создается автоматически?
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on April 29, 2019, 20:37:54
И как его использовать для фонотеки? В первой версии плагина просто вручную создавал плейлист и заполнял FileInfo, а как быть с фонотекой где плейлист создается автоматически?

В смысле для фонотеки? Фонотека заполняется через IAIMPMLDataProviderSelection. А мета данные для файлов - через IAIMPExtensionFileInfoProvider
Title: Re: Проблема с плагином(плагинами)
Post by: Append on April 30, 2019, 07:36:19
А мета данные для файлов - через IAIMPExtensionFileInfoProvider
Костыльно как-то заполнять по два раза поля artist, title, duration. GetFileInfo будет вызываться для каждого файла?

через IAIMPExtensionFileInfoProvider
Как правильно его зарегистрировать?
https://gist.github.com/Appendme/be52bb0348ad9e74cc05997de307cf65
Если так то запрашивает интерфейс IAIMPExtensionFileSystem
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on April 30, 2019, 14:53:41
Костыльно как-то заполнять по два раза поля artist, title, duration. GetFileInfo будет вызываться для каждого файла?

В смысле костыльно? Я ж вам не предлагаю данные хранить в двух местах.

Если так то запрашивает интерфейс IAIMPExtensionFileSystem

Вроде как-то так.
Кто запрашивает? где запрашивает?
Title: Re: Проблема с плагином(плагинами)
Post by: Append on April 30, 2019, 15:24:23
Кто запрашивает? где запрашивает?

После Initialize вызывается QueryInterface класса FileInfoProvider и запрашивается интерфейс IID_IAIMPExtensionFileSystem .
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on April 30, 2019, 16:40:08
После Initialize вызывается QueryInterface класса FileInfoProvider и запрашивается интерфейс IID_IAIMPExtensionFileSystem .

запрашиваться могут разные интерфейсы, это нормально.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on April 30, 2019, 17:44:26
запрашиваться могут разные интерфейсы, это нормально.
Ну IAIMPExtensionFileInfoProvider винапм не запрашивает только IID_IAIMPExtensionFileSystem. Как вообще работает IAIMPExtensionFileInfoProvider, когда из таблицы создаться плейлист для каждой записи будет вызван метод GetFileInfo?

Title: Re: Проблема с плагином(плагинами)
Post by: Artem on April 30, 2019, 19:26:45
IAIMPExtensionFileInfoProvider вызывается при запросе информации о файле, а не при регистрации.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on April 30, 2019, 19:45:05
IAIMPExtensionFileInfoProvider вызывается при запросе информации о файле, а не при регистрации.

А запрос информации когда происходит? Вот выбрал я запись в фонотеке и нажал воспроизвести, дальше у меня появляется новый плейлист и все... метод GetFileInfo не вызывается.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on April 30, 2019, 19:54:09
А запрос информации когда происходит? Вот выбрал я запись в фонотеке и нажал воспроизвести, дальше у меня появляется новый плейлист и все... метод GetFileInfo не вызывается.

Значит плеер нашел другой провайдер для этого файла. А как выглядят пути к файлам? Чтобы однозначно перетащить обработку файлов на свой плагин - лучше использовать собственную схему, как делает плагин для подкастов - все файлы идут с схемой podcast://
Title: Re: Проблема с плагином(плагинами)
Post by: Append on May 01, 2019, 20:12:43
В IAIMPMLDataProviderSelection всем записям задал поле FileName: vkmusic://123123(записи же могут иметь одно и то значение?). GetFileInfo так и не вызвалось.

Code: [Select]
IAIMPServiceFileInfo* sfi = nullptr;
IAIMPFileInfo* fi = nullptr;
_plugin->Core()->QueryInterface(IID_IAIMPServiceFileInfo, reinterpret_cast<void**>(&sfi));

auto r = sfi->GetFileInfoFromFileURI(String("vkmusic://123"), 0, fi);
GetFileInfoFromFileURI - вернуло E_INVALIDARG.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on May 02, 2019, 11:21:58
В IAIMPMLDataProviderSelection всем записям задал поле FileName: vkmusic://123123(записи же могут иметь одно и то значение?). GetFileInfo так и не вызвалось.

Чтобы плеер знал, как работать с кастомным протоколом, нужно зарегистрировать свой IAIMPExtensionFileSystem с имплементацией IAIMPFileSystemXXXCommand
Title: Re: Проблема с плагином(плагинами)
Post by: Append on May 02, 2019, 15:30:32
https://gist.github.com/Appendme/04750a456c7c1a30fe26151d6f697fba
Сделал пока так. Aimp вызвал только два метода: GetValueAsObject и QueryInterface.
При создании плейлиста с таблицы фонотеки GetFileInfo так и не вызывалось. GetFileInfoFromFileURI для vkmusic://123123 все так же возвращает E_INVALIDARG.

Понял. Строку неправильно передаю в GetObject.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on May 02, 2019, 18:24:56
(https://www.aimp.ru/forum/index.php?action=dlattach;topic=59013.0;attach=57428)
А название группы от чего зависит? Ссылки имеют вид vkmusic://owner_id/audio_id
owner_id - 17#######.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on May 02, 2019, 19:25:25
Зависит от используемого шаблона