Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];




Вниз

Технология Plug-Insов 


Rat King   (2002-04-08 11:08) [0]

Подскажите, где можно что-нибудь прочитать про подключение внешних функций обработки например изображений. Пока они находятся в DLL и могут быть в любом виде. Произвольное число функций обработки которые подключаются в момент выполнения программы. Вообще DLL позволяет это сделать, или COM?



Fox   (2002-04-08 11:40) [1]

Может заинтересует ?
На "Королевстве дельфи" в разделе "Подземелье Магов"
http://www.delphikingdom.com/mastering/plugins.htm
http://www.delphikingdom.com/mastering/plugins01.htm



RatKing   (2002-04-10 18:43) [2]

Спасибо Лис вроде все пошло...



Digitman   (2002-04-10 18:57) [3]

Любая DLL - это тоже, своего рода, плагин.



RatKing   (2002-04-11 10:34) [4]

To:Digitman
Имел ввиду подключение тех же DLL с известным синтаксисом функций, в процессе выполнения программы (не в процессе компиляции).



Digitman   (2002-04-11 12:34) [5]

А какая разница, спрашивается ?

Смотри, что здесь происходит и как это можно запросто приспособить под свои нужды.

ОС при попытке первой загрузки некоего затребованного приложением файла библиотеки действует след.образом :
- открывает этот файл как обычный файл;
- анализирует в строго опред.последовательности заголовки (в первую очередь - сигнатуры), предполагая их размещение в строго определенных PE-спецификацией местах в файле;
- если обнаруженные заголовки соответствуют спецификации, опер.системой разворачивается последовательность действий для отображения CS и DS "правильной" DLL на VAS вызывающего процесса, инициализации DS и т.д. и т.п.

Примерно тоже самое (дабы не "изобретать велосипед") может быть реализовано и в прикладном механизме твоего приложения в части задействования стандартной функциональности DLL не просто как абстрактной библиотеки, а как библиотеки-плагина.

А вот одна из примерных схем, позволяющих задействовать готовый системный механизм загрузки/импорта под свои нужды :

- снабжаешь все свои будущие DLL-плагины некоей обязательно эксп.ф-цией с оригинальным (заведомо имеющим минимальную вероятность появления в других DLL, не явл-ся твоими плагинами) именем QueryMyPluginInfo(); для оригинальности можно при сборке своих плагинов задавать им некое расширение, отлич. от "*.DLL", например, "*.MyPlugin";

- экспортируешь (в соответствии с твоей оригинально разработанной спец-цией) реализованные в плагине обязательные и необязательные ф-ции/процедуры;

- при инсталляции плагина размещаешь его либо в предопределенной директории (например, %SystemRoot%) либо в директории, путь к которой фиксируется в создаваемом специально для этой цели ключе реестра;

- твое приложение, "умеющее" работать с твоими же плагинами, при инициализации ищет (по инф-ции в реестре либо в том же пресловутом %SystemRoot%) и составляет временный список плагин-библиотек с предопределенным расширением (что лучше) или со станд. расширением "*.DLL";

- для каждого эл-та врем.списка производится попытка загрузки обычным вызовом LoadLibrary(); при неуспешной загрузке эл-т исключается из врем.списка;

- при успешной загрузке производится попытка получить адрес ф-ции QueryMyPluginInfo() обычным вызовом GetProcAddr(); при отсутствии такой ф-ции среди экспортируемых модуль не считается плагином и тут же выгружается вызовом UnloadLibrary(), а эл-т искл-ся из врем.списка;

- при успешном вызове обнаруженной в модуле ф-ции QueryMyPluginInfo() анализируется и обрабатывается возвращаемый ей блок заранее ожидаемой тобой инф-ции о плагине (на предмет станд./нестанд. св-в и методов плагина); если блок корректен, ссылка на файл плагина и инфа о его параметрах добавляется в некий список потенциально доступных твоему приложению в дан.момент плагинов, а плагин выгружается по UnloadLibrary() (если в дан.момент он тебе не нужен для непосред.работы);

- по состоянию списка потенциально доступных плагинов формируешь, например, некое меню для быстрого доступа к одному из обнаруженных и проверенных на соответствие твоей специф-ции плагинов; при выборе в приложении одного из пунктов этого меню инф-ция о его местоположении и параметрах/возможностях используешь для загрузки соотв.библ-ки и вызова определенных твоей спец-цией плагин-ф-ций; при отказе загрузки по тем или иным причинам соотв. эл-ты списка и меню
исключаются.

И все ! И практически - никаких проблем и головной боли ! Главное - "мягко", без краха вызывающего процесса обрабатывать ошибки загрузки/выгрузки DLL и ошибки вызова эксп-мых ей ф-ций.



RatKing   (2002-04-12 10:06) [6]

To:Digitman © Thanks



RatKing   (2002-04-12 10:23) [7]

Ещё, то что нарыл:
1. Как написать свой PLUGIN (типа поддержки различных форматов файлов ...)
http://z-ol.chat.ru/system.htm#T30
2. Подгружаемые модули (plugins) в Delphi
http://iamhere.inso.ru/2



Бурундук   (2002-04-12 10:51) [8]

2Digitman ©
...анализируется и обрабатывается возвращаемый ей блок заранее ожидаемой тобой инф-ции о плагине (на предмет станд./нестанд. св-в и методов плагина);

Чем-то это мне смутно напоминает IDispatch...



Digitman   (2002-04-12 11:31) [9]

>Бурундук
Да, согласен, есть некоторое сходство.
А что тебя в этом смущает ?




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.029 c
3-80827           MAxiMum               2002-04-03 16:20  2002.04.25  
Обновления в Interbase


1-80971           jin                   2002-04-12 11:30  2002.04.25  
Синтаксис языка Object Pascal


1-80963           tovSuhov              2002-04-12 09:07  2002.04.25  
Создание OCX-компонента...


1-80882           inko                  2002-04-14 11:41  2002.04.25  
Сохранение .ICO файла...


1-80898           Candyras              2002-04-15 00:15  2002.04.25  
Вот такая проблемка...