Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2011, 02:17   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
Стрелка Плагины ввиде dll на основе интерфейсов

Всем доброго времени суток!

Итак давно хочу нреализовть систему плагинов. Опыта в подобном плане нет. А реализовать хочется.

Нашёл пару статей: 1 2

Но хотелось бы чуть подробнее... опыта в этом плане практически нету.

К каким данным предостовлять доступ в программе?
Как правильно создавать интервейс в главной программе и что давать разработчикам плагинов?

В общем по подробнее обо все об этом=)

Если конкретно то:
Что такое интерфейсы?
Как их создавать?
Как работать с ними?
Как организовать правильную работу Главного приложения и работу плагина подключсченного к приложению по средству интерфейса?
Что давать раработчикам плагинов?
К каким данным в основной программе нужно предоставлять доступ из плагина?

Так же былобы совсем не плохо хотябы пару простых исходников на эту тему.

Ну и вопрос о том есть ли что-то более лучшее чем интерфейсы?

Так сказать, дайтте пищу для ума

Последний раз редактировалось Человек_Борща; 08.05.2011 в 02:30.
Человек_Борща вне форума Ответить с цитированием
Старый 08.05.2011, 02:51   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Тут собраны ссылки на статьи по плагинам (саму серию читать не рекомендую - это скорее заныр под капот, чем реализация плагинов; хотя на итоговый пример посмотреть можно).

В частности, там есть ссылки на материал по интерфейсам:
http://www.delphikingdom.ru/asp/view...catalogid=1183
http://www.delphikingdom.ru/asp/view...catalogid=1113
http://www.delphikingdom.ru/asp/view...catalogid=1115

Цитата:
К каким данным предостовлять доступ в программе?
К каким сочтёшь нужным. Больше предоставишь - у плагинов больше возможностей будет. Но и больше проблем по реализации.

Проще всего предоставить к минимуму (можно вообще - к нулю) и попробовать написать несколько полезных плагинов. Наверняка столкнёшься с тем, что данных не хватает. Вот - надо их предоставить.

Цитата:
Как правильно создавать интервейс в главной программе и что давать разработчикам плагинов?
Код:
I := TMyImplementator.Create;
Если вопрос не про создание в run-time, а про проектирование (создание в design-time), то:
1. Не использовать типы данных Delphi, а только системные (меж-языковые).
2. Использовать safecall.

Цитата:
Что такое интерфейсы?
Интерфейс - это "объект без реализации". Суть его использования в том, что за реализацию отвечает плагин, а в программе используется только верхушка айсберга - интерфейс. Это грубо и неправильно, но для первого объяснения - сойдёт.

А вообще - см. ссылки выше.

Цитата:
Ну и вопрос о том есть ли что-то более лучшее чем интерфейсы?
В абстрактном вакууме?

На практике же: интерфейсы и COM - это наиболее удачные методы реализации системы плагинов.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 08.05.2011, 21:54   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Допустим написал такой код:
Код:
unit MyPluginInterface;

interface

uses
  Classes;

type
  ImyPlugin = interface['{D9DCFB5E-3482-443E-8B91-A4EBE83C7DB7}']
  function GetPluginName:string;
  function GetPluginDesc:string;
  end;

implementation

end.
его планируется раздавать людям(пака образно ).

Теперь проблема. Как прикрепить его к программе?

У меня в проекте ListBox и Label

при создании главной формы планируется загружать плагины. Значение возвращенные function GetPluginName:string;заносится именем в listBox

При выборе элемента Listbox планируется в label значение function GetPluginDesc:string;.

Как это организовать?
Человек_Борща вне форума Ответить с цитированием
Старый 08.05.2011, 22:01   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
function GetPluginName:string;
String - тип Delphi. Никаких String в интерфейсе ядро-плагин быть не должно.

Цитата:
Как прикрепить его к программе?
uses MyPluginInterface.

Цитата:
при создании главной формы планируется загружать плагины.
Берёшь и загружаешь. LoadLibrary.

Цитата:
Значение возвращенные function GetPluginName:string;заносится именем в listBox
Прежде чем вызывать GetPluginName, тебе на руки надо получить интерфейс. Интерфейс тебе должен отдать сам плагин, который ты загрузил. Например, экспортированной функцией.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 08.05.2011, 22:18   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
String - тип Delphi. Никаких String в интерфейсе ядро-плагин быть не должно.
Что предлогаете использовать?

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
uses MyPluginInterface.
Подключил. Далее сделал так:
Код:
unit MainFormUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,MyPluginInterface;

type
  TForm1 = class(TForm,ImyPlugin)
    ListBox1: TListBox;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
  private
    { Private declarations }
  public
    { Public declarations }
    function GetPluginName:string;
    function GetPluginDesc:string;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

function TForm1.GetPluginDesc: string;
begin
//??? что тут делать? 
end;

function TForm1.GetPluginName: string;
begin
//??? что тут делать? 
end;

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Берёшь и загружаешь. LoadLibrary.
это я знаю.

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Прежде чем вызывать GetPluginName, тебе на руки надо получить интерфейс. Интерфейс тебе должен отдать сам плагин, который ты загрузил. Например, экспортированной функцией.
Хорошо. Допустим есть такое:

Код:
type
  ImyPlugin = interface['{D9DCFB5E-3482-443E-8B91-A4EBE83C7DB7}']
  function GetPluginInterface:string;
  function GetPluginName:string;
  function GetPluginDesc:string;
  end;
Что делать основному приложению с полученным интерфейсом?
Человек_Борща вне форума Ответить с цитированием
Старый 08.05.2011, 22:26   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Что предлогаете использовать?
WideString. В системе это BSTR.

Цитата:
//??? что тут делать?
А что ты собрался там делать? Плагинов у тебя может быть много. Кого из них дёргать будешь?

Цитата:
это я знаю.
Ну так и начни с этого. Так и понятно станет, что дальше делать. А то сейчас ты с середины начал. Конечно, так может быть непонятно, ведь у тебя на руках нет информации.

Цитата:
Хорошо. Допустим есть такое:
Ты чего-то вообще странное написал.

Ты статьи читал/примеры смотрел?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 09.05.2011, 21:41   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Написал кое-как проект. НЕмогу понять почему ошибки в конструкторах и деструкторах. Помогите найти причину багов и поставьте меня на путь истенный=)

Заранее благодарен!
Вложения
Тип файла: zip my project.zip (51.7 Кб, 21 просмотров)
Человек_Борща вне форума Ответить с цитированием
Старый 09.05.2011, 22:50   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

http://dl.dropbox.com/u/201788/Proje...luginsDemo.rar

В проекте плагина добавь ".." (без кавычек) в Search Path.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.

Последний раз редактировалось GunSmoker; 10.05.2011 в 22:33.
GunSmoker вне форума Ответить с цитированием
Старый 10.05.2011, 19:54   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Интересная реализация много нового для себя открыл.
Как реализовать механизм общения плагин-интерфейс <> сервер-интерфейс?
Как это должно выглядеть(Не кодом).

Есть идея с сендмессаждами но какой тип данных там будет нужен?

Последний раз редактировалось Человек_Борща; 10.05.2011 в 20:27.
Человек_Борща вне форума Ответить с цитированием
Старый 10.05.2011, 22:32   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

В этой реализации при инициализации плагина ему передаётся IHLRCore - это и есть интерфейс сервера (хоста/приложения). Сейчас он пустой, да. Но в реальной программе там будут методы, реализующие услуги, которые предоставляются плагинам.

Конечно же, не нужно пихать ВСЁ в один интерфейс. Сам IHLRCore должен реализовывать лишь базовые вещи - вроде возврата версии ядра, списка плигинов и т.п.

Если надо, к примеру, дать плагинам доступ к главному меню программы, то это должен быть новый интерфейс IHLRMenu. Который, кстати, должен реализовываться главной формой, а в менеджер плагинов ты его передашь при создании формы (FormCreate) и снимешь после выгрузки плагинов (FormDestroy).

И так далее.

Цитата:
Есть идея с сендмессаждами но какой тип данных там будет нужен?
Можно и на сообщениях делать, но... зачем?

Из обмена сообщениями следуют:
1. Проблема упаковки параметров запроса и распаковки результата.
2. Неудобно проверять на ошибки.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подключение интерфейсов к DLL DENISLED Помощь студентам 2 02.04.2011 21:22
Подключение интерфейсов к DLL(написаном на WinAPI) DENISLED Win Api 1 02.04.2011 19:34
Плагины через dll Lime Общие вопросы Delphi 7 17.06.2010 20:50
Переделать ввиде меню! raspberry Общие вопросы C/C++ 0 05.04.2010 23:33
микшер на два потока в проигрывателе музыки. проигрыватель сделан на основе библиотеки Bass.dll D-fens Мультимедиа в Delphi 4 08.06.2007 20:36