AIMP Forum

AIMP for Windows => Дополнения / Addons => Плагины / Plugins => 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
Зависит от используемого шаблона
Title: Re: Проблема с плагином(плагинами)
Post by: Append on October 30, 2019, 14:18:49
Artem, можете сказать почему AIMP выгружает плагин?
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on October 30, 2019, 20:15:57
Artem, можете сказать почему AIMP выгружает плагин?

Не загружает? Я думаю, из-за линковки с VCRuntime: MSVCP140D.dll, ucrtbased.dll, VCRuntime140D.dll
Title: Re: Проблема с плагином(плагинами)
Post by: Append on October 30, 2019, 21:36:00
Не загружает?
В отладчике написано что плагин загружается и потом выгружается.
Я думаю, из-за линковки с VCRuntime: MSVCP140D.dll, ucrtbased.dll, VCRuntime140D.dll
А проверить никак нельзя? Все выше перечисленное должно стоять с установкой IDE.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on October 30, 2019, 21:38:03
Все выше перечисленное должно стоять с установкой IDE.

У меня нет VC++ IDE
Title: Re: Проблема с плагином(плагинами)
Post by: Append on November 04, 2019, 21:08:48
Code: [Select]
Вызвано исключение по адресу 0x77793572 (KernelBase.dll) в AIMP.exe: 0x0EEDFADE (параметры: 0x0117C79A, 0x05644550, 0x03F27DB0, 0x01030D7C, 0x054F6F00, 0x0019F570, 0x0019F55C).
Вызвано исключение по адресу 0x77793572 (KernelBase.dll) в AIMP.exe: 0x0EEDFADE (параметры: 0x7A9EBDF5, 0x056411B0, 0x7A9EBDE3, 0x00000000, 0x0019FE68, 0x0019EEF4, 0x0019EEF4).
https://gist.github.com/Appendme/5dde08e1c2f65415818c29abea676218#file-validate-cpp-L69
Это нормально что SetFocus выбрасывает исключение?

Artem, можете сказать почему AIMP выгружает плагин?
Проблема была в cURL, она почему-то начала линковать библиотеку для HTTP2 динамически.

Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 05, 2019, 08:52:14
Это нормально что SetFocus выбрасывает исключение?

Нет, ненормально - поправлю. Но фокус все равно не сработает - фокус нужно ставить, когда форма уже показана
Title: Re: Проблема с плагином(плагинами)
Post by: Append on November 07, 2019, 20:20:09
Проблемка с IAIMPTask. Хочу сделать асинхронную загрузку каких-то данных и что-то с этих данных вписать в IAIMPUILabel, что cделать можно только с главного потока.
Написал класс https://gist.github.com/Appendme/8b64833ca5d7b0ec6a095ed0398f23eb
для обвертки какой-нибудь функции или лямбды в IAIMPTask, но при обращении к переменной Owner (https://gist.github.com/Appendme/8b64833ca5d7b0ec6a095ed0398f23eb#file-task-cpp-L18) студия сообщает об этом:
Quote
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.
This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 07, 2019, 22:38:00
Возможно, для Owner-а не хватает вызовов _AddRef / _Release и он прибивается, оставляя невалидную ссылку?
Title: Re: Проблема с плагином(плагинами)
Post by: Append on November 08, 2019, 11:14:18
Возможно, для Owner-а не хватает вызовов _AddRef / _Release и он прибивается, оставляя невалидную ссылку?

С валидностью все нормально, после вызова Execute вызывается деструктор. Aimp у класса Task не вызывает только QueryInterface хотя по идеи должен т.к. у класса может быть реализован IAIMPTaskPriority.

Реализовал IAIMPTaskPriority и aimp также не вызывает QueryInterface и <IAIMPTaskPriority >.GetPriority соответственно тоже.
Прицепил плагины и проект. Плагины собраны с таргетом на винду 10, и без динамической линковки.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 10, 2019, 13:26:39
В случае ExecuteInMainThread приоритет не используется. Кстати, если параметр ExecuteNow выставить в True - ошибки не будет. Видимо, VC передает через стек какую-то важную дополнительную информацию, которая, в случае postponed вызова, просто теряется.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on November 10, 2019, 15:19:34
Кстати, если параметр ExecuteNow выставить в True - ошибки не будет. Видимо, VC передает через стек какую-то важную дополнительную информацию, которая, в случае postponed вызова, просто теряется.
При ExecuteNow = false - Нет ошибки если в класс ничего не передавать.
При ExecuteNow = true - Нет ошибки
Так оно и есть, но проблема с соглашениями все равно остается, выпадает исключение, которое можно увидеть в отладчике в отладочной версии.
Может быть ошибка все таки на стороне аимпа?
Кстати, если параметр ExecuteNow выставить в True - ошибки не будет.
Ну тогда смысла никакого нет, вызывать ExecuteInMainThread в главном потоке что выполнить что-то в этом же потоке.



Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 10, 2019, 15:40:00
Ну тогда смысла никакого нет, вызывать ExecuteInMainThread в главном потоке что выполнить что-то в этом же потоке.

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

Может быть ошибка все таки на стороне аимпа?

Она бы тогда повторялась всегда, а не только при postponed-вызове.

А попробуйте, не обращаться к IAIMPTaskOwner.IsCanceled?
Title: Re: Проблема с плагином(плагинами)
Post by: Append on November 10, 2019, 17:21:21
Она бы тогда повторялась всегда, а не только при postponed-вызове.
Ошибка остается хоть при postponed хоть и не postponed вызове. Компилятор создал в отладочной версии некую проверку с выбрасыванием исключения, которое после обрабатывается, и создано оно что уведомить разработчика что что-то не так, а ошибка о которой говорите Вы из-за того что параметры передаются разными соглашениями(о чем и говорит проверка компилятора) и видимо после завершения функции Execute программа возвращает управление не туда куда надо и падает с необработанным исключением.
Если ваш код можно выполнять в любом потоке - нет никакого смысла его вызывать из главного потока.
Код то можно выполнить в любом потоке, а вот изменить UI контрол нельзя ну и Config тоже.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 10, 2019, 18:14:23
Ошибка остается хоть при postponed хоть и не postponed вызове. Компилятор создал в отладочной версии некую проверку с выбрасыванием исключения, которое после обрабатывается, и создано оно что уведомить разработчика что что-то не так, а ошибка о которой говорите Вы из-за того что параметры передаются разными соглашениями(о чем и говорит проверка компилятора) и видимо после завершения функции Execute программа возвращает управление не туда куда надо и падает с необработанным исключением.

С моей стороны отладчик видит падение только в описанном мной случае (я пробовал debug сборку). На счет соглашений. Соглашения у интерфейса IAIMPTask и использующих его сервисов все верные. Единственное место, где используется нестандартное соглашение - IAIMPTaskOwner.IsCanceled - там и в С++ версии SDK прописано соглашение PASCAL.

Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 10, 2019, 18:14:46
Код то можно выполнить в любом потоке, а вот изменить UI контрол нельзя ну и Config тоже.

Так я об этом и говорю
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 10, 2019, 18:16:12
Видимо, придется мне ставить студию и вести отладку с двух сторон - сразу из-под 2х IDE.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on November 10, 2019, 18:20:57
Студия пишет что макрос PASCAL используемый в IAIMPTaskOwner расширяется в __stdcall. Может быть в этом проблема?
Title: Re: Проблема с плагином(плагинами)
Post by: Append on November 10, 2019, 18:26:28
Макрос определен в файле minwindef.h (https://gist.github.com/Appendme/c47d80992ea973c472657d6e33d71b1e#file-minwindef-h-L132) на 132 строке.
Используемое SDK:
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\shared\minwindef.h

Сейчас попробую переписать в апи функцию на:
virtual BOOL pascal IsCanceled() = 0;

Студия видит pascal как зарезервированное слово.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on November 10, 2019, 18:34:18
Сейчас попробую переписать в апи функцию на:
virtual BOOL pascal IsCanceled() = 0;

Студия видит pascal как зарезервированное слово.
Не помогло. В том же файле pascal = __stdcall.

Нашел это: https://docs.microsoft.com/en-us/cpp/cpp/obsolete-calling-conventions?view=vs-2019
Попробую поискать в настройках компоновщика, а сейчас наверное уже стоит переписать ту функцию на stdcall.
Не нашел.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 10, 2019, 19:17:02
А попробуйте, не обращаться к IAIMPTaskOwner.IsCanceled?

Если не обращаться к этому методу - стэк ломаться не должен.

Попробую поискать в настройках компоновщика, а

Странно, раньше-то работало. У меня где-то была 2010-ая студия - сейчас поставлю на виртуалку и посмотрю, как там было.

сейчас наверное уже стоит переписать ту функцию на stdcall.

Чтобы перейти на stdcall нужно вводить новую версию интерфейса.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on November 10, 2019, 20:01:50
Если не обращаться к этому методу - стэк ломаться не должен.
Да, все нормально.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 10, 2019, 20:03:48
Странно, раньше-то работало. У меня где-то была 2010-ая студия - сейчас поставлю на виртуалку и посмотрю, как там было.

попробуйте заменить на pascal или __pascal
Title: Re: Проблема с плагином(плагинами)
Post by: Append on November 10, 2019, 23:09:22
попробуйте заменить на pascal или __pascal
Их убрали как, оказывается, очень давно.

Выше кидал ссылку на пост (https://docs.microsoft.com/en-us/cpp/cpp/obsolete-calling-conventions?view=vs-2019).
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 11, 2019, 14:03:10
Получается, этот интерфейс использовать вовсе нельзя. Допущенную когда-то давно опечатку поправить я просто так не могу - это сломает кучу плагинов и уничтожит совместимость между АПИ разных версий плеера.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 11, 2019, 17:31:47
Есть одна идея, как можно попробовать разрулить эту ситуацию на будущее.
Однако, в этом случае плагин не сможет работать на старых версиях плеера.
Title: Re: Проблема с плагином(плагинами)
Post by: JD on November 11, 2019, 18:11:39
Append, насколько я знаю, указатель на this (self) передаётся в паскале как обычный параметр, поэтому просто вызовите метод с одним параметром.
Достаточно в хидере поправить "virtual BOOL __stdcall IsCanceled(IAIMPTaskOwner*);"
Должно работать, но это не точно  :)
Не надо будет тогда API менять.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 11, 2019, 18:37:09
Append, насколько я знаю, указатель на this (self) передаётся в паскале как обычный параметр, поэтому просто вызовите метод с одним параметром.
Достаточно в хидере поправить "virtual BOOL __stdcall IsCanceled(IAIMPTaskOwner*);"
Должно работать, но это не точно  :)
Не надо будет тогда API менять.

Кстати, интересная идея, сегодня ночью попробую
Title: Re: Проблема с плагином(плагинами)
Post by: Append on November 11, 2019, 19:01:59
Append, насколько я знаю, указатель на this (self) передаётся в паскале как обычный параметр, поэтому просто вызовите метод с одним параметром.
Достаточно в хидере поправить "virtual BOOL __stdcall IsCanceled(IAIMPTaskOwner*);"
Должно работать, но это не точно  :)
Не надо будет тогда API менять.

Так он и так же неявно передается при вызове функции от объекта класса, с Вашим методом теперь еще и два раза.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 11, 2019, 20:32:49
Так он и так же неявно передается при вызове функции от объекта класса, с Вашим методом теперь еще и два раза.


Append, насколько я знаю, указатель на this (self) передаётся в паскале как обычный параметр, поэтому просто вызовите метод с одним параметром.
Достаточно в хидере поправить "virtual BOOL __stdcall IsCanceled(IAIMPTaskOwner*);"
Должно работать, но это не точно  :)

Да, такое решение работает - на мою сторону приходят все параметры верно, НО - при каждом вызове стэк инкрементится на один push. Т.е. если часто этот метод дергать, можем получить переполнение стэка
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 11, 2019, 23:12:05
Я завел новые интерфейсы для IAIMPTaskOwner и сопутствующих классов, теперь используется stdcall.

Вот тестовая сборка:
https://yadi.sk/d/g80ydFh-BU_LiA
SDK:
https://yadi.sk/d/ypjmP1YHgpNRBw

Выпускать ее планирую в конце года. Стоит заметить, что плагины, собранные на этой версии SDK нигде, кроме этой сборке не заведутся.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on November 12, 2019, 08:47:34
Quote
Вызвано исключение по адресу 0x7AE39451 (AIMP.Shared.dll) в AIMP.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCC000000.
Проверяли в моем проекте, который кидал выше(AIMPTaskCpp)?
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 12, 2019, 08:51:11
Проверяли в моем проекте, который кидал выше(AIMPTaskCpp)?

Да, SDK нужно взять новый.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on November 12, 2019, 08:52:08
Прошу прощения не увидел новый интерфейс IAIMPServiceThreads.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 12, 2019, 09:29:20
Прошу прощения не увидел новый интерфейс IAIMPServiceThreads.

Там важно то, что у IAIMPTask, IAIMPTaskOwner новые GUID-ы
Title: Re: Проблема с плагином(плагинами)
Post by: JD on November 14, 2019, 13:47:10
Да, такое решение работает - на мою сторону приходят все параметры верно, НО - при каждом вызове стэк инкрементится на один push. Т.е. если часто этот метод дергать, можем получить переполнение стэка
Значит нужен cdecl, вызывающий стек почистит. И интерфейс будет работать всегда.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 14, 2019, 14:23:44
Значит нужен cdecl, вызывающий стек почистит. И интерфейс будет работать всегда.

Не, cdecl неправильно передает параметр.
Во всяком случае, вопрос уже решен
Title: Re: Проблема с плагином(плагинами)
Post by: Append on November 14, 2019, 17:35:02
Там важно то, что у IAIMPTask, IAIMPTaskOwner новые GUID-ы
Не лучше ли создать еще один хедер, например apiThreading2? Мне в плюсах нужна только процедура ExecuteInMainThread и задачу в неё подаю обычно из двух процедур - <Config>.SetValue* и <SomeUIControl>.SetValue*, думаю будет не совсем критично если после первой процедуры не будет проверки, а так потеряется совместимость.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on November 14, 2019, 18:26:08
<IAIMPMLDataStorageManager>.BackgroundTaskStarted
<IAIMPMLDataStorageManager>.BackgroundTaskFinished

С ними я так понимаю тоже отпечатались? В документации они возвращают HRESULT, а объявлены как void.
(да пробовал менять возвращаемое значение на HRESULT - возвращается *ничего*) 
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 14, 2019, 19:27:00
Не лучше ли создать еще один хедер, например apiThreading2? Мне в плюсах нужна только процедура ExecuteInMainThread и задачу в неё подаю обычно из двух процедур - <Config>.SetValue* и <SomeUIControl>.SetValue*, думаю будет не совсем критично если после первой процедуры не будет проверки, а так потеряется совместимость.

Никто не мешает вам использовать старый SDK
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 14, 2019, 19:27:45
С ними я так понимаю тоже отпечатались? В документации они возвращают HRESULT, а объявлены как void.
(да пробовал менять возвращаемое значение на HRESULT - возвращается *ничего*) 

В данном случае косяк в документации. Я как раз сегодня добавлял туда новые интерфейсы и обнаружил нестыковку
Title: Re: Проблема с плагином(плагинами)
Post by: Append on November 18, 2019, 12:30:08
В данном случае косяк в документации. Я как раз сегодня добавлял туда новые интерфейсы и обнаружил нестыковку

Не хватает 3го примечания о том что функции можно вызвать только в главном потоке.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 18, 2019, 13:18:41
Не хватает 3го примечания о том что функции можно вызвать только в главном потоке.

Внизу в Summary вроде было
Title: Re: Проблема с плагином(плагинами)
Post by: Append on November 18, 2019, 16:47:33
Внизу в Summary вроде было
Ээм... да есть и я как-то между строк прочитал и не заметил этого. Я так понимаю работает это только в потоках аимпа или в плюсовых тоже должно работать?
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 18, 2019, 19:41:45
Ээм... да есть и я как-то между строк прочитал и не заметил этого. Я так понимаю работает это только в потоках аимпа или в плюсовых тоже должно работать?

Работает это тольки из главного (UI) потока
Title: Re: Проблема с плагином(плагинами)
Post by: Append on November 18, 2019, 19:47:24
Работает это тольки из главного (UI) потока
Quote
Если вызов поступит из второстепенного потока - API автоматически переведет его в главный поток.
Не понятно. Когда поток главный, а когда главный(UI).
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 18, 2019, 19:54:21
UI поток всегда главный.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on November 18, 2019, 20:39:09
UI поток всегда главный.
Хорошо. Тогда зачем переводить функцию с главного потока в главный? Почему функция возвращающая ничего сама не выполняется в главном потоке, хотя в документации сказано что если вызвали с второстепенного потока(т.е. НЕ главного), то вызвана она будет в главном потоке, но оно так не работает.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on November 18, 2019, 20:58:11
Да, вы правы, вызов не из главного потока никогда не работал. Доку поправлю.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on January 20, 2020, 21:54:28
https://gist.github.com/Appendme/2ca4c3bb4c73f9f79ff8f4cc780f3b3b
Artem, почему-то после закрытия формы висит одна ссылка на IAIMPUIFormEvents.
После закрытия вызываются методы: OnCloseQuery(CanClose = true(1)), OnDestroyed.
Счетчик ссылок тикает в общем-то только из-за  IAIMPUIFormEvents.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on January 20, 2020, 22:03:00
Code: [Select]
  // Release all variables
  FLog := nil;
  FTreeList := nil;
  FImages := nil;
  FForm := nil;

Такой код в Delphi не только зануляет переменную, но, в случае интерфейсов, еще и декрементит счетчик ссылок
Title: Re: Проблема с плагином(плагинами)
Post by: Append on January 20, 2020, 22:19:56
Если я вызову Release у формы (в OnDestroyed) то вызовется опять OnDestroyed?

Добавлено.
В OnDestroyed вызываю релиз у DemoForm после OnDestroyed вызывается еще раз релиз после FormEvent и форма удаляется, но EventHandler NotifyEventAdapter переданный для кнопки остается в памяти.

Позже могу залить сюда весь проект.
Title: Re: Проблема с плагином(плагинами)
Post by: Append on January 21, 2020, 00:37:10
Сделал отдельный класс Demo с IAIMPUIFormEvents и кнопкой с NotifyEventAdapter.
Title: Re: Проблема с плагином(плагинами)
Post by: Artem on January 23, 2020, 23:31:03
Увы, студия под руками только 2010-ая, она не собирает этот код, т.ч. смотрел глазами.
Мне кажется, ошибка кроется здесь:

Code: [Select]
void WINAPI DemoForm::OnDestroyed(IAIMPUIForm* Sender)
{
...
if (_form)
{
Release(); <<<<<
}
}

По логике должно быть так:

Code: [Select]
if (_form)
{
_form->Release(0);
_form = nullptr;
}