Delphirus - прграммирование на delphi
   Все о delphi Delphirus - прграммирование на delphi
blocks.gif
Навигация
 

Главная
Статьи
Базы данных
Графика
Защита
Интернет
Система
Тексты
Мультимедиа
Файлы
Формы и окна
Другое
Советы
Базы данных
Графика
Интернет
Мультимедиа
Система
Тексты
Файлы
Файлы
Исходники
Компоненты
Инфо
Поиск по сайту
Обратная связь
Самое популярное
Аккаунт
Карта сайта

 
 
 

Советы по delphi \ Файловая система \ DLL \ Как работать с плагинами

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

Я сделал так - выбираю все 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);
...

Название: Как работать с плагинами
Дата публикации: 2004-05-24 (2846 Прочтено)

 
 

 

Page generation 0.031 seconds