Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.013 c
15-1201188142
Anatoly Podgoretsky
2008-01-24 18:22
2008.02.24
Что хотят, то и творят.


3-1191344520
красотка (С)
2007-10-02 21:02
2008.02.24
Домашнее задание по курсу «Реляционные БД».


2-1201538510
MVanya
2008-01-28 19:41
2008.02.24
вопрос про интерфейсы


6-1180700684
Тфьу
2007-06-01 16:24
2008.02.24
Indy 10 TThread


15-1201083737
Игорь Шевченко
2008-01-23 13:22
2008.02.24
Как добиться, чтобы русский текст письма выглядел по-русски...




   Наверх