Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.05 c
4-1183993259
AlexanderMS
2007-07-09 19:00
2008.02.24
Рисование с "прозрачным" цветом.


15-1200823612
мойипизвестен
2008-01-20 13:06
2008.02.24
Чтобы вы сделали?


3-1192011059
Alex
2007-10-10 14:10
2008.02.24
проблема в передаче выборки из БД в Rave


2-1201541016
Inslave
2008-01-28 20:23
2008.02.24
Ini + checbox


15-1200664184
Evanescence
2008-01-18 16:49
2008.02.24
граббер в php





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский