Delphi World - Как работать с плагинами
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Как работать с плагинами

Автор: 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);
...

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования