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

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

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

Post by NightRoman » Wed 07 Aug, 2013 17:30

Latest post of the previous page:

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

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

User avatar
DrKnS
Posts: 4617
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 121 times
Contact:

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

Post by DrKnS » Wed 07 Aug, 2013 17:55

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

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

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

Post by Sav » Wed 07 Aug, 2013 19:40

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

Вместо 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: 4617
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 121 times
Contact:

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

Post by DrKnS » Wed 07 Aug, 2013 19:47

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 » Sat 10 Aug, 2013 09:41

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

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

User avatar
DrKnS
Posts: 4617
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 121 times
Contact:

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

Post by DrKnS » Sat 10 Aug, 2013 14:31

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

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

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

Post by Sav » Sat 10 Aug, 2013 15:04

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


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

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

User avatar
DrKnS
Posts: 4617
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 121 times
Contact:

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

Post by DrKnS » Sat 10 Aug, 2013 16:41

решил попробовать потихонечку кропать адаптер для питона в надежде что кто-нибудь либо обгонит, либо подхватит.
: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 » Mon 12 Aug, 2013 14:02

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

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

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

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

User avatar
DrKnS
Posts: 4617
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 121 times
Contact:

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

Post by DrKnS » Mon 12 Aug, 2013 14:28

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

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

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

Post by HaRT » Mon 12 Aug, 2013 15:21

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

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

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

Post by Sav » Mon 12 Aug, 2013 16:38

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


User avatar
DrKnS
Posts: 4617
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 121 times
Contact:

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

Post by DrKnS » Mon 12 Aug, 2013 16:52

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


User avatar
techie
Posts: 761
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 28 times
Been thanked: 2 times

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

Post by techie » Fri 14 Feb, 2014 19:44

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

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

User avatar
DrKnS
Posts: 4617
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 121 times
Contact:

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

Post by DrKnS » Fri 14 Feb, 2014 20:00

Это не хост. Это прослойка.
Если всё сделано правильно, то загрузка/выгрузка твоего plugin.py ничем не будет отличаться от plugin.dll.

User avatar
techie
Posts: 761
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 28 times
Been thanked: 2 times

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

Post by techie » Fri 14 Feb, 2014 20:28

А мне наоборот надо чтобы отличалось, потому что я не вникаю в то, как это работает на уровня С. В Питоне я бы хотел генерить плагины вообще динамически, чтобы не важно было откуда он берётся, но чтобы в меню всё исправно добавлял.

User avatar
cmd.exe
Posts: 333
Joined: Fri 16 Apr, 2010 18:26
Location: Нижний Новгород
Has thanked: 170 times
Been thanked: 5 times
Contact:

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

Post by cmd.exe » Thu 31 Dec, 2015 16:30

Враппер для множества языков отлично сздан в Vim. Для сравнения можно исходники понюхать...
Всех с наступающим новым годом!
I've been using Vim for about 2 years now, mostly because I can't figure out how to exit it. (c) I Am Devloper
I know nothing except the fact of my ignorance. (с) Socrates

Post Reply

Return to “Development”