Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2016, 16:34   #1
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию Управление объектом приложения из длл (Plugin)

Есть программа, которая умет использовать плагины, все работает хорошо, НО чтобы что-то сделать в программе - приходится изобретать велосипед передавая в PlugProc все данные и вызывая их уже в основной программе.
Немного кода из плагина:
Код:
Function StartPlugin(AppHandle: Cardinal; PProc: Pointer): Cardinal; Stdcall;
Begin
  @PlugProc := Pointer(pproc);
  Application.Handle := AppHandle;
  MainForm := TMainForm.Create(Application);
  MainForm.Visible := true;
  Result := 1;
End;

Procedure ShowPlugin; Stdcall;
Begin
  MainForm.Visible := Not MainForm.Visible;
End;
В Основной программе:
Код:
function PlugProc (Code: Cardinal; p1, p2, p3: PWideChar): PWideChar; stdcall;
begin
  case code of
    ord(NSomeMethod):SomeMethod;
    ord(NSomeElseMethod):SomeElseMethod;
    else msg('method not find' + code.ToString);
  end;  
end;
Суть вопроса:
Как сделать адаптер (класс), который можно передать из Основной программы в Плагин(dll), и в плагине вызывать его методы.
Сейчас для этого нужно делать @PlugProc := Pointer(pproc); для каждого метода, а их достаточно много.

На сколько я знаю, можно просто создать копию описания класса в плагине и передавать адрес на всю структуру класса, НО при условии точной копии описания, а я не знаю ВСЕХ методов.

Также знаю что можно просто создать наследника этого класса и не описывать все, но получив доступ ко всем родительским методам.
Но как здесь подойти пока не понимаю.
IvaniuS вне форума Ответить с цитированием
Старый 30.01.2016, 18:26   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

На интерфейсах все реализуйте.

Плагин IPlugin, реализует некий свой TPluginMega с обязательными методами, заявленными в интерфейсе. На старте, ядром вызывается функция в dll, куда передается интерфейс приложения-ядра. Все. Плагин делает QueryInterface и получает то, что хочет из основного приложения.
Человек_Борща вне форума Ответить с цитированием
Старый 30.01.2016, 18:44   #3
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

К сожалению мне трудно Вас понять, прочитал целую серию статей о плагинах в блоге GunSmoker как там это все реализовано, но тоже не понял как это можно реализовать.

Есть ли где-то пример реализации или статья по этому поводу.
И\или что нужно предоставить Вам для этого.
IvaniuS вне форума Ответить с цитированием
Старый 30.01.2016, 19:26   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Есть ли где-то пример реализации или статья по этому поводу.
И\или что нужно предоставить Вам для этого.
Более полноценно, подробнее, и разжевано чем GunSmoker - никто не пишет. Если вы его статьи не осилили, значит не ваш уровень пока.
Человек_Борща вне форума Ответить с цитированием
Старый 30.01.2016, 19:35   #5
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Там не рассматривается мой пример на сколько я понял и реализовываются свои плагины, у меня уже все готово, и изменить я это не могу, нету доступа к исходникам приложения, есть только paxcompiler где могу немного "подшаманить" и вызвать этот плагин и не более того.
Говорить о таких вещах как интерфейсы полноценные как в статье GunSmoker paxcompiler не знает, а если извращатся то делает это также извращенно.
Спасибо.
IvaniuS вне форума Ответить с цитированием
Старый 30.01.2016, 19:43   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

На сколько помню этот скрипт. движек умеет создавать интерфейсы, опишите интерфейс всего нужного в скрипте, затем этот интерфейс передавайте в свой плагин.
Человек_Борща вне форума Ответить с цитированием
Старый 30.01.2016, 19:47   #7
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Спасибо - буду дальше пытаться, думаю мне нужно просто чуть лучше изучить доступную информацию.
IvaniuS вне форума Ответить с цитированием
Старый 30.01.2016, 19:49   #8
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Создаешь интерфейс.
IMyInterface
Генерируешь к нему GUID. Помещаешь его в *.inc
Он будет использоваться как в плагине так и в баовой программе. Поэтому через inc проще что-бы не копировать.

Создаешь интерфейсы класс
Type
TMyClass=Class(TInterfacedObject, IMyInterface)
...

передаешь из плагина в основную программу ссылку на объект этого класса.
Передаешь в обезличенном виде т.е. как TInterfacedObject
Пусть эта передача сделана функцией GetObj.

var MyObj:IMyInterface;
Obj:=GetObj;
// Далее используем как обычный объект
Obj.Foo(x,y);
Obg.MyProperty:=x;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 30.01.2016, 19:52   #9
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Там не рассматривается мой пример на сколько я понял и реализовываются свои плагины, у меня уже все готово, и изменить я это не могу, нету доступа к исходникам приложения, есть только paxcompiler где могу немного "подшаманить"
Раз нет доступа к исходникам и там изначально небыли заложена поддержка интерфейсов.
Тогда да придётся писать адаптер.
Цитата:
Сейчас для этого нужно делать @PlugProc := Pointer(pproc); для каждого метода, а их достаточно много.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 30.01.2016, 22:11   #10
IvaniuS
Форумчанин
 
Аватар для IvaniuS
 
Регистрация: 16.04.2007
Сообщений: 225
По умолчанию

Спасибо, какие-то интерфейсы есть, сейчас как раз эксперементирую, но пока ничего не получается, TMyClass=Class(TInterfacedObject, IMyInterface) не хочет создавать класс.
А как можно написать адаптер для всего класса, или только методами??

Последний раз редактировалось IvaniuS; 31.01.2016 в 13:34.
IvaniuS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление socket'ом чужого приложения, как в WPE PRO Reimscher Работа с сетью в Delphi 13 05.08.2015 17:14
Управление компонентами другого приложения/окна OmegaBerkut Общие вопросы Delphi 9 16.09.2013 13:03
Plugin для IE draiffer C/C++ Сетевое программирование 0 29.03.2012 18:11
QIP Plugin W0LF Общие вопросы Delphi 3 24.04.2011 11:28
Управление настройками компьютера из приложения Delphi Saili Общие вопросы Delphi 2 05.12.2006 11:41