Форум: "Основная";
Текущий архив: 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]>Бурундук
Да, согласен, есть некоторое сходство.
А что тебя в этом смущает ?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c