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

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

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

Post by NightRoman »

Latest post of the previous page:

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

П.С. Но сам я бы модули по папкам адаптеров раскладывал. Ну не важно. Успехов в развитии!
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 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: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 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: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 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: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 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: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

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

Post by DrKnS »

Sav wrote:OpenW приведенная - это жульничество, там в параметрах ссылка на плагин оказалась, а вот пример GetPluginInfoW() в адаптере напишите.
Нужно в каждую функцию плагина работающую через адаптер добавить параметром то, что вернул CreateInstance(), не?
Это не жульничество, ссылка оказалась там не случайно, и это именно то, чего вам хочется.
Поле Instance, содержащее то, что вернул CreateInstance(), было добавлено в каждую передаваемую в плагин *Info структуру одновременно с внедрением адаптеров.
User avatar
HaRT
Moderator
Posts: 10806
Joined: Tue 30 Aug, 2005 17:21
Has thanked: 220 times
Been thanked: 357 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: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

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

Post by DrKnS »

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

User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

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

Post by techie »

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

Может плагин хост инициировать загрузку/выгрузку плагина в любой момент времени?
Как хост сообщает информацию о новом плагине Фару - вызывает ли он функцию типа CreatePlugin(pluginfo, evenhandler) или сам Far чего-то там по Си АйПиАю дергает (лезет грузить .dll или что там ему ещё нужно)?
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

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

Post by DrKnS »

Это не хост. Это прослойка.
Если всё сделано правильно, то загрузка/выгрузка твоего plugin.py ничем не будет отличаться от plugin.dll.
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

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

Post by techie »

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

Return to “Development”