Адаптеры (или плагины на любых языках и с любым интерфейсом)

Разработка Far.
User avatar
NightRoman
Posts: 5940
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 14 times
Been thanked: 15 times
Contact:

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by NightRoman »

Latest post of the previous page:

DrKnS wrote:
Это как 2 плагина будет Фаром трактоваться?
Нет. Кто первый встал - того и тапки.
Ну тогда точно лучше адаптеры в папке обычных плагинов держать, а их модули в их специальной подпапке. Это оптимально для сканирования и есть плюс, описанный выше (адаптер может и сам обычным плагином быть, по желанию). Да и операция убрать/добавить все скопом - и адаптер, и все его плюшки - будет проще, ибо все в одной папке.

User avatar
DrKnS
Posts: 5620
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 9 times
Been thanked: 302 times

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by DrKnS »

Ну тогда точно лучше адаптеры в папке обычных плагинов держать, а его модули в его специальной подпапке. Это оптимально для сканирования и есть плюс, описанный выше (адаптер может и сам обычным плагином быть, по желанию)
Это не оптимально для пользователя.
Я вот, например, хочу, скачав какой-то lua- или ps1-скрипт с форума и зная, что у меня есть соответствующий рантайм, тупо кинуть его в plugins (или вообще загрузить по load:), а не блуждать по этим вашим иерархическим структурам папок.
адаптер по своему желанию может быть также и сам плагином. Например, предоставлять какой-то общий UI, команды меню, комстроки, и настройки, характерные для всех его модулей.
Так это уже сейчас можно. Делаешь пустой плагин "commonUI", в адаптере смотришь - если это он, выдаешь какие-то встроенные фичи.

User avatar
NightRoman
Posts: 5940
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 14 times
Been thanked: 15 times
Contact:

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by NightRoman »

ОК, ОК... В целом - очень хорошая идея и начинание. Я не критикую вовсе, а, во-первых, сам пытаюсь лучше понять и, может, использовать (для Фарнет или нет, видно будет), а во-вторых, хочется если не идеального, то чего-то получше сразу. Ведь сейчас самое подходящее время об этом думать и предлагать что-то.

П.С. Но сам я бы модули по папкам адаптеров раскладывал. Ну не важно. Успехов в развитии!

User avatar
DrKnS
Posts: 5620
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 9 times
Been thanked: 302 times

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by DrKnS »

NightRoman wrote:П.С. Но сам я бы модули по папкам адаптеров раскладывал.
Критика и предложения яростно приветствуются, но раскладывание по папкам - это именно то, что мы имеем сейчас и от чего как раз и хочется уйти к свободе, равенству и братству.

User avatar
Sav
Posts: 53
Joined: Thu 15 Jan, 2009 15:25
Has thanked: 1 time

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by Sav »

Начинаем вдумчиво курить. Кстати, хорошо бы закрепить первый пост и обновлять. Вопросы скорее всего тупые, но все ж равно придется много раз объяснять.

Вместо GetFunctionAddress(HANDLE Instance, const wchar_t* functionname) (из первого поста) в GenericPluginModel обнаружился InitExports(plugin_instance instance, void** exports).
Вместо HANDLE WINAPI CreateInstance(const wchar_t* filename) толи Plugin* CreatePlugin(const string& filename) толи plugin_module Create(const string& filename).
и в чем разница между plugin_module и plugin_instance?

User avatar
DrKnS
Posts: 5620
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 9 times
Been thanked: 302 times

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by DrKnS »

Sav wrote:Вместо GetFunctionAddress(HANDLE Instance, const wchar_t* functionname) (из первого поста) в GenericPluginModel обнаружился InitExports(plugin_instance instance, void** exports).
Вместо HANDLE WINAPI CreateInstance(const wchar_t* filename) толи Plugin* CreatePlugin(const string& filename) толи plugin_module Create(const string& filename).
и в чем разница между plugin_module и plugin_instance?
Чего вас туда понесло? Курить надо структуру CustomPluginModel::Imports, а не внутренние интерфейсы фара.

User avatar
Sav
Posts: 53
Joined: Thu 15 Jan, 2009 15:25
Has thanked: 1 time

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by Sav »

Упс ступил, спасибо, теперь понятно и даже работает.

По-моему забыли инициализацию адаптера фаром. Нужен SetStartupInfoW для адаптера до того как начнем обнюхивать плагины и т.п.

User avatar
DrKnS
Posts: 5620
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 9 times
Been thanked: 302 times

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by DrKnS »

Sav wrote:По-моему забыли инициализацию адаптера фаром. Нужен SetStartupInfoW для адаптера до того как начнем обнюхивать плагины и т.п.
А зачем?

User avatar
Sav
Posts: 53
Joined: Thu 15 Jan, 2009 15:25
Has thanked: 1 time

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by Sav »

Что, фару нечего сказать адаптеру? :)


Вот первое что захотелось - иметь FARSTANDARDFUNCTIONS *FSF в адаптере. Наверное, неплохо ими пользоваться для совместимости. Для чего? Ну например
На самом деле я искал, где бы адаптеру взять каталог плагинов фара (удобно добавить ее в список мест откуда питон грузит модули), в fsf, к своему удивлению, я таких api не нашел...

Мне наверное с этими вопросами в разработку плагинов надо перебираться, просто такая глобальная фича как адаптеры сделана так быстро, что я ее подозреваю в незавершенности.

User avatar
DrKnS
Posts: 5620
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 9 times
Been thanked: 302 times

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by DrKnS »

решил попробовать потихонечку кропать адаптер для питона в надежде что кто-нибудь либо обгонит, либо подхватит.
:good:
Что, фару нечего сказать адаптеру?
Ну мне почему-то кажется, что до тех пор, пока ни один плагин, поддерживаемый адаптером, не загружен (а плагины, напомню, как правило грузятся только при первом их вызове, а до этого вся инфа берётся из кеша) - адаптеру стоит повременить со своей инициализацией и не затормаживать запуск фара.
А вот когда любой из поддерживаемых адаптером плагинов загрузится - придет SetStartupInfo и адаптер вполне сможет доинитить всё, что нужно. Типа паттерн lazy initialization.
А вот GetGlobalInfo у адаптеров видимо, всё же следует вызывать, т. к. возможную несовместимость версий никто не отменял.
На самом деле я искал, где бы адаптеру взять каталог плагинов фара (удобно добавить ее в список мест откуда питон грузит модули), в fsf, к своему удивлению, я таких api не нашел...
А нет таких api, т. к. в общем случае плагин может быть загружен из произвольного места (см. load:)
такая глобальная фича как адаптеры сделана так быстро, что я ее подозреваю в незавершенности.
Так и есть.

User avatar
Sav
Posts: 53
Joined: Thu 15 Jan, 2009 15:25
Has thanked: 1 time

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by Sav »

Продолжаем тупить:

Идея как я понял из GetFunctionAddress() вернуть указатель на функцию адаптера, так как же при вызове этой функции адаптер поймет какой плагин дергать? OpenW приведенная - это жульничество, там в параметрах ссылка на плагин оказалась, а вот пример GetPluginInfoW() в адаптере напишите.

Нужно в каждую функцию плагина работающую через адаптер добавить параметром то, что вернул CreateInstance(), не?

Либо адаптер должен возвращать то, что называется замыканием в функциональных языках, но, боюсь для C(++) это проблема.

User avatar
DrKnS
Posts: 5620
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 9 times
Been thanked: 302 times

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by DrKnS »

Sav wrote:OpenW приведенная - это жульничество, там в параметрах ссылка на плагин оказалась, а вот пример GetPluginInfoW() в адаптере напишите.
Нужно в каждую функцию плагина работающую через адаптер добавить параметром то, что вернул CreateInstance(), не?
Это не жульничество, ссылка оказалась там не случайно, и это именно то, чего вам хочется.
Поле Instance, содержащее то, что вернул CreateInstance(), было добавлено в каждую передаваемую в плагин *Info структуру одновременно с внедрением адаптеров.

User avatar
HaRT
Moderator
Posts: 9446
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 106 times
Been thanked: 223 times

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by HaRT »

Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
Sav
Posts: 53
Joined: Thu 15 Jan, 2009 15:25
Has thanked: 1 time

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by Sav »

Ясно, спасибо. Правда мне кажется смешение в одном параметре IN и OUT аргументов немного неакадемичным (Там же некоторые Info передавались в плагин, а некоторые возвращались).


User avatar
DrKnS
Posts: 5620
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 9 times
Been thanked: 302 times

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by DrKnS »

Sav wrote:мне кажется смешение в одном параметре IN и OUT аргументов немного неакадемичным (Там же некоторые Info передавались в плагин, а некоторые возвращались).
Есть немного, да. Но перспектива описывать 32 новых сигнатуры функций мне нравится гораздо меньше.


User avatar
techie
Posts: 782
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 33 times
Been thanked: 4 times

Re: Адаптеры (или плагины на любых языках и с любым интерфей

Post by techie »

Я вот так и не понял.

Может плагин хост инициировать загрузку/выгрузку плагина в любой момент времени?
Как хост сообщает информацию о новом плагине Фару - вызывает ли он функцию типа CreatePlugin(pluginfo, evenhandler) или сам Far чего-то там по Си АйПиАю дергает (лезет грузить .dll или что там ему ещё нужно)?

Post Reply

Return to “Development”