|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Интерфейс Плагин<->Программа
Занимаюсь внедрением плагинов, возникла необходимость в организации интерфейса между плагином и программой, наподобии интерфейса в QIP Infium. Не могу понять алгоритм инициализации плагина...Плагин должен привязываться к своему сервису плагинов в главной программе...в общем нужна помощь
Вот тут SDK QIP'а Помогите плиз... |
#2
|
||||
|
||||
Неужели никто не знает??? Эт очень важно!!!
|
#3
|
|||
|
|||
В чем проблема?
1. Ищете в папке плагинов файлы с расширением dll 2. Вызываете процедуру (должна быть во всех плагинах) возвращающую информацию о плагине и производящую первоначальную инициализацию. 3. Добавляете полученную инфу в самой программе в список плагинов. |
#4
|
||||
|
||||
Если кратко:
Qip загружает dll с твоим плагином и найдя в ней функцию CreateInfiumPLUGIN, вызывает ее при этом он передает тебе интерфейс для связи с сервером - PluginService: IQIPPluginService а ты ему свой интерфейс - типа IQIPPlugin для того чтобы работал твой интерфейс из двух функций предварительно создается объект класса TQipPlugin.Create(PluginService) сервер видит только твой интерфейс PHP код:
в общемто все кроме инициализации, описаний интерфейсов и констант можешь менять когда ты хочешь чтото сообщить или получить от сервера то используешь его интерфейс PHP код:
PHP код:
В общем гдето так удачи |
#5
|
||||
|
||||
2 s0Creator:
Как делать плагины к квипу я знаю. Я не знаю как организовать подобное в своей проге. При вызове функции CreateInfiumPLUGIN в нее передается IQIPPluginService, который изначально равен nil, поэтому вылетает ошибка access violation...К тому же возвращается значение типа IQIPPlugin...Поэтому я не знаю, как инициализировать плагин Последний раз редактировалось KOOL, 01.03.2008 в 12:25. |
#6
|
||||
|
||||
А ты не заметил как dll передает свой интерфейс
PHP код:
чтоб его передать необходимо создать интерфейсный объект я вообще делал это так: PHP код:
|
#7
|
||||
|
||||
Мда...учиться, учиться и учиться....Спасибо за наставление на истинный путь)))
|
#8
|
||||
|
||||
Проблемыыы.... Не получается создать класс интерфейсного объекта...По идее в нем должны быть те же процедуры, что и в интерфейсе + свои..но компилятор на этом участке ругается на недекларированную процедуру:
Код:
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
|
||||
|
||||
Да!! подколол
минут 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; Удачи |
#10
|
||||
|
||||
Мда...вот тебе и CodeRush, да еще вечером...";" ставит где ни попадя...а я не заметил...
Без GUID какнить обойдусь. Итак заработало |
#11
|
||||
|
||||
И последний вопрос(как я надеюсь ): как все-таки подключить плагин? Чему нужно присвоить результат функции 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
|
||||
|
||||
Помогите плиз
|
#13
|
||||
|
||||
несмого извини не всегда много времени
чуть по позже попробую сформулировать но былобы лечше еслиб скилет хотя бы чтоб в Д7 или Д2006 загрузить я этой проблемой года 3 назад занимался Последний раз редактировалось s0Creator, 06.03.2008 в 16:04. |
#14
|
||||
|
||||
Держи скилет на Д7
там FPlayPluginService собирает загружаемые плагины в лист и при уничтожении освобождает Надеюсь разберешься (я часа 2 матюкался - давно интерфейсами не баловался) Удачи |
#15
|
||||
|
||||
С П А С И Б О ! ! !
ГРОМААААААДНЕЙШЕЕ СПАСИБО!!!!!!!! буду разбираться
|