Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения
KANSoftWare

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

Delphi , Файловая система , DLL и PlugIns

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

Автор: Nomadic

Я сделал так - выбираю все 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 может быть полезна для разработчиков на Delphi и FreePascal.


Комментарии и вопросы


Ваше мнение или вопрос к статье в виде простого текста (Tag <a href=... Disabled). Все комментарии модерируются, модератор оставляет за собой право удалить непонравившейся ему комментарий.

заголовок

e-mail

Ваше имя

Сообщение

Введите код




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: DLL и PlugIns ::


реклама



©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru Rambler's Top100
29.03.2024 11:35:23/0.03604793548584/2