Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Есть имя Интерфейса и Метода. Как вызвать Метод, COM Plug-in DLL 
V
    Опции темы
Shtorm
  Дата 8.3.2009, 02:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 23.2.2009
Где: Таганрог

Репутация: нет
Всего: 1



Доброго времени суток. Есть приложение загружающее библиотечки расположенные в папке (например Plug-in самого приложения). Библиотеки реализовываются с исользованием COM object, в библиотеки есть интерфейс со своим именем, которое мне известно (например IPlugIn) в этом интерефейсе реализован метод с именем Load.
1) Вопрос первый
   Как вызвать этот метод (IPlugIn.Load)
2) Вопрос второй
   библиотек в этой папке больше чем одна, и при загрузке нужно вызывать этот метод реализованный именно в этой Dll, т.е. в каждой библиотеки этот метод    имеет свою реализацию, возможно ли это сделать, если да, то как?
3) Вопрос третий
    Возможно ли это сделать, или лучше, например, экспортировать метод Load из этой Dll и вызывать его(экспортировать конечно не сложно и вызывать, так и делаю, мне интересно знать есть-ли другие варианты)?
Может есть другие варианты загрузки библиотеки и вызова метода который выполняет нужный мне код, при этом библиотеки, а значит и их таблица интерфейса отсутвует, но я к примеру знаю, что в этой библиотеки будет реализован метод Load, который вызывается основной программой.
PM MAIL ICQ   Вверх
Rrader
  Дата 8.3.2009, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 6
Всего: 191



Цитата(Shtorm @  8.3.2009,  08:22 Найти цитируемый пост)
Как вызвать этот метод (IPlugIn.Load)

Нужно экспортировать библиотеку типов для этого COM-объекта (средствами Delphi). COM-объект должен быть уже зарегистрирован в системе. После этого можно получить указатель на интерфейс, зная CLSID (берется из TLB и начинается с "CLASS_"), например:
Код

CreateComObject(CLASS_Plugin) as IPlugin;

Но, как правило, в библиотеке TLB уже есть CoClass - там в конструкторе уже этот функционал заложен. И создаем так:
Код

var
  I: IPlugin;
begin
  I := CoPlugin.Create;
  I.Load;
end;

Цитата(Shtorm @  8.3.2009,  08:22 Найти цитируемый пост)
2) Вопрос второй

А тут в чем проблема? В каждой библитотеке "сидит" свой CLSID, с этим и нужно играться.
Цитата(Shtorm @  8.3.2009,  08:22 Найти цитируемый пост)
3) Вопрос третий

Использование COM-объекта является широкоприменяемой методикой, которая часто позволяет строить маневренные приложения со многими возможностями. Экспорт напрямую проще программировать в целом, и он производительнее. Я говорю об интерфейсной плагинной системе, как конкуренте COM-объекту.


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Shtorm
  Дата 8.3.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 23.2.2009
Где: Таганрог

Репутация: нет
Всего: 1



Цитата(Rrader @  8.3.2009,  13:59 Найти цитируемый пост)
var  I: IPlugin;begin  I := CoPlugin.Create;  I.Load;end;

C этим я знакОм, книжки читал. Дело в том что бы вызвать этот конструктор необходимо подключить эту таблицу к основной программе на этапе разработки, это легко и понятно и вызывать методы реализованные в этом интерефейсе, но вопрос у меня другого плана был, у меня нет таблицы интерфейсов этой изначально на этапе проектирования основного приложения, но мне нужно будет вызывать этот метод из самой библиотеки, которая будет разрабатываться уже на готовое приложение. Т.е. задача в следующем есть готовое приложение (которое и пишу сейчас), там где екзешник программы находится папка Plug-in в которую закидывают библиотеки, в каждой реализован будет метод Load (например), а интерфейс имеет имя IPlugIn. Моё приложение проверяет библиотеки в этой папке и вызывает этот метод. (Библиотека изначально в реестре не зарегестрирована). Как это сделать? Может описать в моей программе вызываемый интерфейс (как правильно это описание сделать?) и создавать его экземпляр и обращаться к этому методу, но метод этот реализован по своему в каждой библиотеки(как правильно вызывать этот метод), а следовательно нужно вызывать метод именно из этой библиотеки.
Я понимаю, что можно делать так
Код

  IPluIn = interface(IDispatch)
    ['{B8B783F2-607E-4845-BF02-EBECD6A04EF8}']
    procedure Load; safecall;
  end;
//......................
Var
     IPIn: IPluIn;
begin
        IPIn := CreateComObject(StringToGUID('{AFBFF8FE-9AEC-414A-970E-26A34507CC92}')) as IPluIn;
        IPIn.Load;
end;

Но это работат естественно только для зарегестрированной в системе библиотеки, и если даже регестрировать её, то вызовится только последняя реализация Load. И при разработке плагинов вызовет трудности с созданием его, нужно будет копировать эти гьюды и цлсиды. А если не делать этого, то нужно как-то этот интерфей описывать по другому(как это сделать не знаю) естественно и вызывать иначе.
Поэтому и инетересуюсь, если я знаю Имя интерфейса и имя метода(ов) реализующие этот интерфейс, как при загрузки библиотеки, изначально не зарегестрированной в системе, вызвать нужный мне метод, реализованный в этой библиотеки. 


Это сообщение отредактировал(а) Shtorm - 8.3.2009, 22:43
PM MAIL ICQ   Вверх
Rrader
  Дата 9.3.2009, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 6
Всего: 191



Shtorm, все понятно smile По ссылке ниже есть пример простой интерфейсной плагинной системы без COM.

Link


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Shtorm
  Дата 9.3.2009, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 23.2.2009
Где: Таганрог

Репутация: нет
Всего: 1



Rrader, Так я и делал, там идёт экспорт функции из библиотеки, мне интересно другое, если не эксортировать функции, и реализовать библиотеку как COM, то можно ли получить доступ к этому интерфейсу, зная только имя. Ну то есть мы экспортируем функцию в библиотеки как в том примере и вызываем её, зная её имя, меня это и интересует можно ли реализовать то же самое, но только без экспорта функции, зная имя интерфейса и функции или так нельзя делать?  smile 
PM MAIL ICQ   Вверх
MetalFan
Дата 9.3.2009, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 3
Всего: 128



Цитата(Shtorm @  9.3.2009,  11:48 Найти цитируемый пост)
но только без экспорта функции

а как такое возможно, если подумать?

Цитата(Shtorm @  9.3.2009,  11:48 Найти цитируемый пост)
реализовать библиотеку как COM, то можно ли получить доступ к этому интерфейсу, зная только имя

в итоге же всеравно библиотека экспортирует ряд функций для жизнеобеспечения работы встроенного COM-сервера. 
только это делается на уровне системы, и пользователь в коде сам не вызывает загрузку библиотеки и поиск нужной функции.

так что остается выбрать:
1. Тяжеловесность COM, на 2 строки меньше кода
2. Быстроту и универсальность "ручной" загрузки библиотеки и поиск функции, на 2 строки больше кода.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Shtorm
Дата 9.3.2009, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 23.2.2009
Где: Таганрог

Репутация: нет
Всего: 1



Полазил по Drkb нашёл там хорошую статейку, как реализовать всё это без явного экспортирования функции с исользованием позднего и раннего связывания. В общем хорошая статейка в старой версии Drkb её не было. (©Drkb::04563)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0784 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.