Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.02.2008, 15:46
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию Интерфейс Плагин<->Программа

Занимаюсь внедрением плагинов, возникла необходимость в организации интерфейса между плагином и программой, наподобии интерфейса в QIP Infium. Не могу понять алгоритм инициализации плагина...Плагин должен привязываться к своему сервису плагинов в главной программе...в общем нужна помощь
Вот тут SDK QIP'а Помогите плиз...
Ответить с цитированием
  #2  
Старый 29.02.2008, 14:25
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

Неужели никто не знает??? Эт очень важно!!!
Ответить с цитированием
  #3  
Старый 29.02.2008, 15:47
Phedor Phedor вне форума
Начинающий
 
Регистрация: 28.02.2008
Сообщения: 118
Репутация: 21
По умолчанию

В чем проблема?
1. Ищете в папке плагинов файлы с расширением dll
2. Вызываете процедуру (должна быть во всех плагинах) возвращающую информацию о плагине и производящую первоначальную инициализацию.
3. Добавляете полученную инфу в самой программе в список плагинов.
Ответить с цитированием
  #4  
Старый 29.02.2008, 17:11
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
Подмигивание

Если кратко:
Qip загружает dll с твоим плагином и найдя в ней функцию CreateInfiumPLUGIN, вызывает ее
при этом он передает тебе интерфейс для связи с сервером - PluginService: IQIPPluginService
а ты ему свой интерфейс - типа IQIPPlugin
для того чтобы работал твой интерфейс из двух функций предварительно создается объект класса
TQipPlugin.Create(PluginService)
сервер видит только твой интерфейс
PHP код:
IQIPPlugin = interface
  
// сервер получает информацию о плагине
    
function  GetPluginInfopPluginInfostdcall;
  
// сервер вызывает чтобы сообщить плагину о событиях (плагин загружен, запуск плагина, останов и т.д.)
  // смотри реализацию в классе TQipPlugin там все подробно расписано на чистом англицком
    
procedure OnQipMessage(var PlugMsgTPluginMessage); stdcall;
  
end
в своем плагине ты сам пишешь как ты будешь реагировать на событи
в общемто все кроме инициализации, описаний интерфейсов и констант можешь менять

когда ты хочешь чтото сообщить или получить от сервера то используешь его интерфейс
PHP код:
IQIPPluginService = interface
    
// позволяет тебе сохранить или загрузить сохраненные опции
    
function  PluginOptions(DllHandleLongInt): pPluginSpecificstdcall;
    
// посылаешь серверу вообщение на которое он отреагирует
    
procedure OnPluginMessage(var PlugMsgTPluginMessage); stdcall;
  
end
который ты сохранил в
PHP код:
constructor TQipPlugin.Create(const PluginServiceIQIPPluginService);
begin
  FPluginSvc 
:= PluginService;
end

В общем гдето так
удачи
Ответить с цитированием
  #5  
Старый 01.03.2008, 12:21
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

2 s0Creator:
Как делать плагины к квипу я знаю. Я не знаю как организовать подобное в своей проге.
При вызове функции CreateInfiumPLUGIN в нее передается IQIPPluginService, который изначально равен nil, поэтому вылетает ошибка access violation...К тому же возвращается значение типа IQIPPlugin...Поэтому я не знаю, как инициализировать плагин

Последний раз редактировалось KOOL, 01.03.2008 в 12:25.
Ответить с цитированием
  #6  
Старый 01.03.2008, 15:01
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

А ты не заметил как dll передает свой интерфейс
PHP код:
function CreateInfiumPLUGIN(PluginServiceIQIPPluginService): IQIPPluginstdcall;
begin
  Result 
:= TQipPlugin.Create(PluginService);
end
интерфейс это только описание предиставляемых методов
чтоб его передать необходимо создать интерфейсный объект
я вообще делал это так:
PHP код:
if FSQLDriver nil then FSQLDriver := TSQLDriver.Create ;
      
FSQLDriver.GetInterface(ISQLDriver,Result); 
Ответить с цитированием
  #7  
Старый 02.03.2008, 20:11
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

Мда...учиться, учиться и учиться....Спасибо за наставление на истинный путь)))
Ответить с цитированием
  #8  
Старый 03.03.2008, 20:16
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

Проблемыыы.... Не получается создать класс интерфейсного объекта...По идее в нем должны быть те же процедуры, что и в интерфейсе + свои..но компилятор на этом участке ругается на недекларированную процедуру:
Код:
unit PPlugin

...
IPluginService = interface
    procedure OnPluginMessage(var PlugMsg: TPPluginMessage); stdcall;
  end;
  pIPluginService = ^IPluginService;
...
---------------------------------------------
//основная программа

...
type
    TPluginService = class(TInterfacedObject, IPluginService);//Вот тут ошибка [Error] PlaylistForm.pas(3893): Undeclared identifier: 'OnPluginMessage'
      public
        procedure OnPluginMessage(var PlugMsg: TPPluginMessage); stdcall;
    end;
    pTPluginService = ^TPluginService;

procedure TPluginService.OnPluginMessage(var PlugMsg: TPPluginMessage);
begin
//...
end;
...

Последний раз редактировалось KOOL, 03.03.2008 в 20:37.
Ответить с цитированием
  #9  
Старый 04.03.2008, 11:04
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Да!! подколол
минут 10 смотрел в Д7 на твою ошибку.
Найди одно отличие:
Код:
type
    TPluginService = class(TInterfacedObject, IPluginService)//Вот тут ошибка [Error] PlaylistForm.pas(3893): Undeclared identifier: 'OnPluginMessage'
      public
        procedure OnPluginMessage(var PlugMsg: TPPluginMessage); stdcall;
    end;

Кстати Делфи вроде рекомендует объявлять интерфейсы так:
Код:
IPluginService = interface
    ['{46388778-FBD2-460B-AEA4-2AC103ABB86E}']
    procedure OnPluginMessage(var PlugMsg: TPPluginMessage); stdcall;
  end;
То что в квадратных скобках генерится по Ctrl+Shift+G
Удачи
Ответить с цитированием
  #10  
Старый 04.03.2008, 14:53
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

Мда...вот тебе и CodeRush, да еще вечером...";" ставит где ни попадя...а я не заметил...
Без GUID какнить обойдусь. Итак заработало
Ответить с цитированием
  #11  
Старый 04.03.2008, 15:31
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

И последний вопрос(как я надеюсь ): как все-таки подключить плагин? Чему нужно присвоить результат функции CreatePlayerPlugin(PluginService: IPluginService) ?... вот временный код:
Код:
procedure TPLForm.LoadPlugin(Name : string);
var
  Srv: IPPlugin;                //
  PSrv : IPluginService;     //Это будут глобальные переменные
  HndDLLHandle: THandle; //
  Msg : TPPluginMessage;
  CreatePlayerPlugin : function(PluginService : IPluginService):IPPlugin;
begin
  HndDLLHandle:=LoadLibrary(PChar(ExeDir+'Plugins\'+Name));
  if HndDLLHandle<>0 then
    begin
      @CreatePlayerPlugin:=GetProcAddress(HndDLLHandle,'CreatePlayerPlugin');
      if @CreatePlayerPlugin<>nil then
        try
          PSrv := TPluginService.Create;  //вот тут я и не знаю
          Srv := CreatePlayerPlugin(PSrv);//как делать. вылезает
        except
          on EAccessViolation do;           //AccessViolation
        end
      else
        Application.MessageBox('Function not exists','Player',MB_TOPMOST+MB_ICONERROR);
    end
  else
    Application.MessageBox('DLL not found','Player',MB_TOPMOST+MB_ICONERROR);
 FreeLibrary(HndDLLHandle);
end;

Последний раз редактировалось KOOL, 05.03.2008 в 17:49.
Ответить с цитированием
  #12  
Старый 05.03.2008, 17:50
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

Помогите плиз
Ответить с цитированием
  #13  
Старый 05.03.2008, 19:44
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

несмого извини не всегда много времени
чуть по позже попробую сформулировать
но былобы лечше еслиб скилет хотя бы чтоб в Д7 или Д2006 загрузить
я этой проблемой года 3 назад занимался

Последний раз редактировалось s0Creator, 06.03.2008 в 16:04.
Ответить с цитированием
  #14  
Старый 06.03.2008, 16:03
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Держи скилет на Д7
там FPlayPluginService собирает загружаемые плагины в лист и при уничтожении освобождает
Надеюсь разберешься (я часа 2 матюкался - давно интерфейсами не баловался)
Удачи
Вложения
Тип файла: zip TestPlug.zip (11.4 Кбайт, 26 просмотров)
Ответить с цитированием
  #15  
Старый 06.03.2008, 20:09
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
Радость С П А С И Б О ! ! !

ГРОМААААААДНЕЙШЕЕ СПАСИБО!!!!!!!! буду разбираться
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:35.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter