Форум: "Начинающим";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];
Внизвопрос про интерфейсы Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.041 c