Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-81077
dimich
2002-03-19 08:54
2002.04.25
Проблема с ХР.


1-80909
UserL
2002-04-12 13:39
2002.04.25
Не получаеться совсем.


3-80741
DiggerAbstract
2002-04-03 10:55
2002.04.25
Оптимизация SQL запроса


1-80859
Stasya
2002-04-13 15:13
2002.04.25
Запуск


4-81108
Vladimir Bolotin
2002-01-10 20:33
2002.04.25
прозрачность в win2k





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский