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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.07.2009, 15:26   #1
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию Поддержка плагинов

Привет всем! Я по юзал поиск по форуму, но не нашёл того, что мне было нужно.

В общем:

В EXE объявлен класс
Код:
type
   tSomeInterface= class;
   private
   fIntVar: integer;
   fStrVar: string;
   fBoolVar: boolean;
   
   procedure setIntVar(const value: integer); virtual; stdCall;
   procedure setStrVar(const value: string); virtual; stdCall;
   procedure setBoolVar(const value: boolean); virtual; stdCall;
   published
   { тут коснструктор и деструктор }
   function mulIntOn2(const value: integer): integer; virtual; stdCall;
   
   property IntVar: integer read fIntVar write setIntVar;
   property StrVar: integer read fStrVar write setStrVar;
   property BoolVar: integer read fBoolVar write setBoolVar; 
   end;
var
someInterface: tSomeInterface;
И в DLL аналог
Код:
type
   tSomeInterface= class;
   private
   fIntVar: integer;
   fStrVar: string;
   fBoolVar: boolean;
   
   procedure setIntVar(const value: integer); virtual; stdCall; abstract;
   procedure setStrVar(const value: string); virtual; stdCall; abstract;
   procedure setBoolVar(const value: boolean); virtual; stdCall; abstract;
   published
   { тут коснструктор и деструктор }
   function mulIntOn2(const value: integer): integer; virtual; stdCall; abstract;
   
   property IntVar: integer read fIntVar write setIntVar;
   property StrVar: integer read fStrVar write setStrVar;
   property BoolVar: integer read fBoolVar write setBoolVar; 
   end;
В DLL (плагин) передаётся переменная someInterface
В итоге я без проблем могу вызывать mulIntOn2 и читать/изменять те 3 свойства.

Теперь вопрос:
Как мне из DLL перехватывать вызов функций mulIntOn2, setIntVar, setStrVar и setBoolVar так, что-бы я мог получить параметры, переданные функции, вернуть то что я хочу или вызвать исходную функцию?

Помогите пожалуйста...
Altera вне форума Ответить с цитированием
Старый 29.07.2009, 15:38   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

Вы можете отслеживать это все хозяйство в самой DLL или в основной программе?
То есть:
Программа осуществляет вызов функции из библиотеки, какие параметры Вы хотите поймать? И Где?
Если в DLL, то здесь можно просто в каждую функцию вставить вызов специальной процедурки, в которую и происходит передача параметров (а она уже там ими распоряжается).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 29.07.2009, 16:13   #3
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Вы можете отслеживать это все хозяйство в самой DLL или в основной программе?
То есть:
Программа осуществляет вызов функции из библиотеки, какие параметры Вы хотите поймать? И Где?
Если в DLL, то здесь можно просто в каждую функцию вставить вызов специальной процедурки, в которую и происходит передача параметров (а она уже там ими распоряжается).
Я не знаю. Может будет кнопка в программе которая при нажатии будет вызывать mulIntOn2. А может она из другого подключенного плагина будет вызываться.
Altera вне форума Ответить с цитированием
Старый 29.07.2009, 17:05   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Делал уже кучу разных систем поддержки плагинов. Скажу сразу, подход крайне не корректный. Если делается все это для Windows, самый оптимальный и лучший подход это
1. все свести к функциям, к низкому уровню, без всяких классов (как вы сделали) - только Pointer(на класс или структуру), PChar и другое.
2. все вызовы в формате stdcall;
3. плагину дать управления как возможно меньше. Если все-таки никак, то делаите экспорт нужной функции из .exe (в этой функции сделать жесткую проверку на все входящие данные). В плагине получить текущий (т.е. приложения) дескриптор, и получить адрес экспортируемой функции, таким образом плагин сможет что-то вызывать/обращаться к программе.

Как пример могу посоветовать Object Dock Docklet SDK. скачайте и просмотрите как там все организовано.

Ваш вариант реализации плагинов только для Delphi, т.е. другие разработчики будут привязаны к Delphi, и не смогут использовать другой язык для реализации плагинов, а это большой минус.

Последний раз редактировалось BOBAH13; 29.07.2009 в 17:08.
BOBAH13 вне форума Ответить с цитированием
Старый 29.07.2009, 18:03   #5
Altera
Старожил
 
Аватар для Altera
 
Регистрация: 29.01.2008
Сообщений: 2,406
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Делал уже кучу разных систем поддержки плагинов. Скажу сразу, подход крайне не корректный. Если делается все это для Windows, самый оптимальный и лучший подход это
1. все свести к функциям, к низкому уровню, без всяких классов (как вы сделали) - только Pointer(на класс или структуру), PChar и другое.
2. все вызовы в формате stdcall;
3. плагину дать управления как возможно меньше. Если все-таки никак, то делаите экспорт нужной функции из .exe (в этой функции сделать жесткую проверку на все входящие данные). В плагине получить текущий (т.е. приложения) дескриптор, и получить адрес экспортируемой функции, таким образом плагин сможет что-то вызывать/обращаться к программе.

Как пример могу посоветовать Object Dock Docklet SDK. скачайте и просмотрите как там все организовано.

Ваш вариант реализации плагинов только для Delphi, т.е. другие разработчики будут привязаны к Delphi, и не смогут использовать другой язык для реализации плагинов, а это большой минус.
Да нет ещё экспортировать каждую функцию в отдельноси... Так куда удобнее.

Я вот думал record использовать. Но не совсем то что надо будет. А перехватывать то как?

Последний раз редактировалось Stilet; 30.07.2009 в 11:02.
Altera вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание плагинов для Opera M_script Общие вопросы C/C++ 3 08.06.2009 16:43
Создание плагинов на DLL: SharedMemory darkstarx Общие вопросы Delphi 13 22.01.2008 22:31
Помогите с разработкой приложения с поддержкой плагинов. krik Общие вопросы Delphi 3 17.06.2007 13:40
Написание программ или плагинов для тюнера Behold TV СТРАННИК Общие вопросы Delphi 0 29.01.2007 09:54