Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.24;
Скачать: CL | DM;

Вниз

вопрос про интерфейсы   Найти похожие ветки 

 
MVanya   (2008-01-28 19:41) [0]

Я не про COM"овские интерфейсы говорю. Абстрактный вопрос наверное.
Видел в реализации "плагинного" движка такой прием, как: из приложения - плагину отдается один интерфейс, а плагин - отдает приложению другой.

Например - плагин (dll) - экспортируемая функция:
function CreatePLUGIN(PluginService: IPluginService): IPlugin; stdcall;
begin
 Result := TPlugin.Create(PluginService);
end;

exports
 CreatePLUGIN name "CreatePLUGIN";


Сами интерфейсы:
этот отдают из dll в приложение
 IPlugin = interface
   function  GetPluginInfo: pPluginInfo; stdcall;
   procedure OnMessage(var PlugMsg: TPluginMessage); stdcall;
 end;

а этот отдает приложение плагину:
 IPluginService = interface
   function  PluginOptions(DllHandle: LongInt): pPluginSpecific; stdcall;
   procedure OnPluginMessage(var PlugMsg: TPluginMessage); stdcall;
 end;


А для реализации функционала плагина - делают в dll класс наследованный от TInterfacedObject и IPlugin, т.е.:

type
 TPlugin = class(TInterfacedObject, IPlugin)
 private
   FPluginSvc      : IPluginService;
   FPluginInfo     : TPluginInfo;
   ...
   constructor Create(const PluginService: IPluginService);
 end;

...
constructor TPlugin.Create(const PluginService: IPluginService);
begin
 FPluginSvc := PluginService;
end;
...


Зачем так делают? В чем преимущества применения интерфейсов в таком случае?

Спасибо.


 
Григорьев Антон ©   (2008-01-28 21:32) [1]

1. Легче получить указатель на одну функцию и, вызвав её, получить интерфейс, чем вызывать LoadLibrary для десятка-другого функций, каждый раз проверяя, что такая функция есть в библиотеке.

2. При компиляции плагина легче контролировать, что все требуемые функции реализованы и что их прототипы соответствуют требуемым.

3. Функции плагина можно разделить по группам, каждой назначить свой интерфейс, и тогда, в зависимости от того, какие из интерфейсов поддерживаются, определять, какую функциональность содержит конкретный плагин.



Страницы: 1 вся ветка

Текущий архив: 2008.02.24;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.017 c
3-1192089119
Quart
2007-10-11 11:51
2008.02.24
Подключение к БД


11-1183818425
BMouradov
2007-07-07 18:27
2008.02.24
KolBZip2


2-1201604770
Звоновский
2008-01-29 14:06
2008.02.24
Помогите считать текст из Static чужого окна


15-1200822319
Черный Шаман
2008-01-20 12:45
2008.02.24
И когда же этот CodeGear(ака Borland) сделают Delphi 64bit?


15-1201102321
OSokin
2008-01-23 18:32
2008.02.24
Исходники декомпилятора