AIMP Forum

AIMP for PC => Дополнения / Addons => Разработка / Development => Topic started by: DarkDrawKill on April 26, 2026, 13:27:49

Title: Множественное наследование IUnknown
Post by: DarkDrawKill on April 26, 2026, 13:27:49
При попытке за-ап-кастить объект класса наследующий IUnknown несколько раз происходит ошибка IUnknown is ambiguous class of ...
такое может произойти например когда класс прослойка для формы окна наследует несколько ивенктов или база данных фонотеки наследует провайдер (по документации она обязана это сделать)
как решить данную задачу я не нашёл кроме как указание наследования виртуальным
Code: [Select]
class ...: public virtual IUnknown
{
}
но я не уверен в работоспособности потому что возможно он меняет виртуальную таблицу

пз в apiPlaylists старые определения констант
Title: Re: Множественное наследование IUnknown
Post by: Artem on April 26, 2026, 21:35:29
При попытке за-ап-кастить объект класса наследующий IUnknown несколько раз происходит ошибка IUnknown is ambitious class of ...
такое может произойти например когда класс прослойка для формы окна наследует несколько ивенктов или база данных фонотеки наследует провайдер (по документации она обязана это сделать)
как решить данную задачу я не нашёл кроме как указание наследования виртуальным

IUnknown реализуется базовым классом прослойкой, что идёт вместе с SDK. Вам не надо его реализовывать самостоятельно.

пз в apiPlaylists старые определения констант

Поправил
Title: Re: Множественное наследование IUnknown
Post by: DarkDrawKill on April 26, 2026, 22:12:17
IUnknown реализуется базовым классом прослойкой, что идёт вместе с SDK. Вам не надо его реализовывать самостоятельно.
Проблема не в IUnknownImpl а в самом IUnknown который наследуется несколько раз из-за чего происходит ошибка
Code: [Select]
class MyMusicLibrary: public IUnknownImpl<IAIMPMLExtensionDataStorage>,
                      public IAIMPMLDataProvaider
{
 /* ... */
}
если за-ап-кастить объект данного класса в IUnknown произойдёт ошибка (ээто нужно чтобы передать его в IAIMPCore->RegisterExtension)
потому что оба IAIMPMLExtensionDataStorage и IAIMPMLDataProvaider наследуют IUnknown
Title: Re: Множественное наследование IUnknown
Post by: Artem on April 26, 2026, 22:19:30
а в самом IUnknown который наследуется несколько раз

Откуда он наследуется-то? Это от него все наследуются.

если за-ап-кастить объект данного класса в IUnknown

Вообще говоря, кастить объекты к интерфейсам нельзя. Нужно использовать QueryInterface.
Title: Re: Множественное наследование IUnknown
Post by: DarkDrawKill on April 26, 2026, 22:22:33
Вообще говоря, кастить объекты к интерфейсам нельзя. Нужно использовать QueryInterface
так внутри QueryInteface тоже идёт неявный апкаст типов

гзв жалуется что QueryInterface является 'ambiguous' потому что он принадлежит IUnknown
Title: Re: Множественное наследование IUnknown
Post by: Artem on April 26, 2026, 22:36:37
В плюсах я не силён, не подскажу, как правильно решать такие ситуации.

Вот исходники довольно навороченного плагина на С++ для AIMP:
https://github.com/kubik-jaroslav/AIMPYouTube/blob/master/OptionsDialog.h
Title: Re: Множественное наследование IUnknown
Post by: DarkDrawKill on April 27, 2026, 09:05:04
Вот исходники довольно навороченного плагина на С++ для AIMP:
https://github.com/kubik-jaroslav/AIMPYouTube/blob/master/OptionsDialog.h
костыль так костыль
но с виртуальным наследованием я поэкспериментирую
Title: Re: Множественное наследование IUnknown
Post by: Artem on April 27, 2026, 09:24:10
В смысле костыль? А как у майкрософта разруливаются подобные ситуации? Ведь тут за основу взята Com-модель.
Title: Re: Множественное наследование IUnknown
Post by: DarkDrawKill on April 27, 2026, 09:49:22
В смысле костыль? А как у майкрософта разруливаются подобные ситуации? Ведь тут за основу взята Com-модель.
я не знаю поэтому здесь и спросил
костыль потому что приходится перелопачивать методы IUnknown даже если это уже сделал IUnknownImpl

гзв нашёл данную статью (https://learn.microsoft.com/ru-ru/windows/win32/com/aggregation)
если буквально это тоже самое что и сервисы которые берутся из ядра используя QueryInterface
Title: Re: Множественное наследование IUnknown
Post by: Artem on April 27, 2026, 10:05:48
я не знаю поэтому здесь и спросил

Увы, я на C++ не пишу, не могу подсказать.