Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.25;
Скачать: CL | DM;

Вниз

Технология 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
3-80809
Mikeee
2002-04-05 08:50
2002.04.25
Как вставить в строку SQL-запроса одинарные кавычки


14-81067
fishka
2002-03-20 14:29
2002.04.25
Переписать игрушку с компашки с защитой. Можно ли это сделать, чтобы работало корректно?


14-81082
Prog_SKV1
2002-03-19 07:08
2002.04.25
InterBase 6.5


1-80870
Di_wind
2002-04-14 00:22
2002.04.25
си++ Шаблон.


1-80947
snoup
2002-04-11 22:55
2002.04.25
Дайти кто-нибудь простинький кодик как сделать кнопку круглой?