![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
вопрос про интерфейсы
MVanya © (2008-01-28 19:41:00)Я не про 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:00) [1]1. Легче получить указатель на одну функцию и, вызвав её, получить интерфейс, чем вызывать LoadLibrary для десятка-другого функций, каждый раз проверяя, что такая функция есть в библиотеке.
2. При компиляции плагина легче контролировать, что все требуемые функции реализованы и что их прототипы соответствуют требуемым.
3. Функции плагина можно разделить по группам, каждой назначить свой интерфейс, и тогда, в зависимости от того, какие из интерфейсов поддерживаются, определять, какую функциональность содержит конкретный плагин.