Приветствую Вас Гость | RSS

Меню сайта

Реклама

Категории раздела
CD-ROM [11]
DLL и PlugIns [75]
Help файлы [20]
INI файлы [16]
RS232 [2]
Активные директории [1]
Директории [0]
Диски [0]
Корзина [5]
Порты [26]
Ресурсы [0]
Файлы [0]
Форматы файлов [15]
Ярлыки [0]

Наш опрос
Есть ли у Вас свой сайт?
Всего ответов: 48

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Форма входа

Главная » Статьи » Файловая система » DLL и PlugIns

Как работать с плагинами

Я сделал так - выбираю все DLL из каталога с программой, загружаю каждую и пытаюсь найти в ней функцию (через API GetProcAddress) с заранее определенным жестко именем (например что нибудь типа IsPluginForMyStuff). Если нашлась - DLL считается моим плагином, если нет - выгрузить и забыть.

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

Вот часть моего кода по работе с плагинами...


...
type

// Процедурные типы для хранения ссылок на функции плагинов
TGetNProc = function: shortstring;
TGetSProc = function: integer;
TProcessProc = procedure(config: pointer; request: PRequest; var reply:
PReply);
TConfigProc = procedure(defcfg: PSysConfig; var config: pointer);
TSaveLoadProc = procedure(inifile: pointer; var config: pointer);

// Информация об отдельном плагине
TPlugin = record
Name: shortstring;
// Полное название
Filename: shortstring; // Имя файла
Handle: integer; // Хэндл загруженной DLL
CFGSize: integer; // Размер конфигурации в RAM
ProcessProc: TProcessProc; // Адрес процедуры обработки
ConfigProc: TConfigProc; // Адрес процедуры настройки
LoadCFG, SaveCFG: TSaveLoadProc; // Адреса процедур чтения/записи cfg
end;
PPlugin = ^TPlugin;

// Список загруженных плагинов
TPlugins = class(TList);

...

var
Plugins: TPlugins;
sr: TSearchRec;
lib: integer;
pgetn: TGetNProc;
pgets: TGetSProc;
plugin: PPlugin;

...

// Читаем плагины и создаем их список.
Plugins := TPlugins.Create;
if FindFirst('*.dll', faAnyFile, sr) <> 0 then
begin

ShowMessage('Hе найдено подключаемых модулей.');
Close;
end;
repeat

lib := LoadLibrary(PChar(sr.Name));
if lib <> 0 then
begin
@pgetn := GetProcAddress(lib, 'GetPluginName');
if @pgetn = nil then
FreeLibrary(lib)
// Hе плагин
else
begin
New(plugin);
@pgets := GetProcAddress(lib, 'GetCFGSize');
plugin.Name := pgetn;
plugin.Filename := sr.Name;
plugin.CFGSize := pgets;
plugin.Handle := lib;
plugin.ConfigProc := GetProcAddress(lib, 'Configure');
plugin.ProcessProc := GetProcAddress(lib, 'Process');
plugin.SaveCFG := GetProcAddress(lib, 'SaveCFG');
plugin.LoadCFG := GetProcAddress(lib, 'LoadCFG');
Plugins.Add(plugin);
end;
end;
until FindNext(sr) <> 0;
FindClose(sr);
...
Категория: DLL и PlugIns | Добавил: Skinner (06.07.2008)
Просмотров: 367 | Рейтинг: 0.0/0
  Delphi Lab   Главная   Регистрация   Вход  
Интересная Цитата

Поиск

Магазин


Copyright MyCorp © 2025 Хостинг от uCoz