Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];

Вниз

Технология Plug-Insов   Найти похожие ветки 

 
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 и ошибки вызова эксп-мых ей ф-ций.



Страницы: 1 вся ветка

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

Наверх





Память: 0.45 MB
Время: 0.006 c
1-80968
Rat King
2002-04-08 11:08
2002.04.25
Технология Plug-Insов


1-80992
shane54
2002-04-12 16:43
2002.04.25
Вроде элементарно.... но как? :)


3-80831
bobr12
2002-04-05 16:28
2002.04.25
Создание отчетов


1-80970
Jaxtor
2002-04-12 11:21
2002.04.25
Закрытие формы MDIChild программным методом


1-80995
Emstem
2002-04-12 14:05
2002.04.25
Генерация событий в классе





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский