![]() |
Модераторы: MetalFan |
![]() ![]() ![]() |
|
Shtorm |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 23.2.2009 Где: Таганрог Репутация: нет Всего: 1 |
Доброго времени суток. Есть приложение загружающее библиотечки расположенные в папке (например Plug-in самого приложения). Библиотеки реализовываются с исользованием COM object, в библиотеки есть интерфейс со своим именем, которое мне известно (например IPlugIn) в этом интерефейсе реализован метод с именем Load.
1) Вопрос первый Как вызвать этот метод (IPlugIn.Load) 2) Вопрос второй библиотек в этой папке больше чем одна, и при загрузке нужно вызывать этот метод реализованный именно в этой Dll, т.е. в каждой библиотеки этот метод имеет свою реализацию, возможно ли это сделать, если да, то как? 3) Вопрос третий Возможно ли это сделать, или лучше, например, экспортировать метод Load из этой Dll и вызывать его(экспортировать конечно не сложно и вызывать, так и делаю, мне интересно знать есть-ли другие варианты)? Может есть другие варианты загрузки библиотеки и вызова метода который выполняет нужный мне код, при этом библиотеки, а значит и их таблица интерфейса отсутвует, но я к примеру знаю, что в этой библиотеки будет реализован метод Load, который вызывается основной программой. |
|||
|
||||
Rrader |
|
||||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 6 Всего: 191 |
Нужно экспортировать библиотеку типов для этого COM-объекта (средствами Delphi). COM-объект должен быть уже зарегистрирован в системе. После этого можно получить указатель на интерфейс, зная CLSID (берется из TLB и начинается с "CLASS_"), например:
Но, как правило, в библиотеке TLB уже есть CoClass - там в конструкторе уже этот функционал заложен. И создаем так:
А тут в чем проблема? В каждой библитотеке "сидит" свой CLSID, с этим и нужно играться. Использование COM-объекта является широкоприменяемой методикой, которая часто позволяет строить маневренные приложения со многими возможностями. Экспорт напрямую проще программировать в целом, и он производительнее. Я говорю об интерфейсной плагинной системе, как конкуренте COM-объекту. |
||||
|
|||||
Shtorm |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 23.2.2009 Где: Таганрог Репутация: нет Всего: 1 |
C этим я знакОм, книжки читал. Дело в том что бы вызвать этот конструктор необходимо подключить эту таблицу к основной программе на этапе разработки, это легко и понятно и вызывать методы реализованные в этом интерефейсе, но вопрос у меня другого плана был, у меня нет таблицы интерфейсов этой изначально на этапе проектирования основного приложения, но мне нужно будет вызывать этот метод из самой библиотеки, которая будет разрабатываться уже на готовое приложение. Т.е. задача в следующем есть готовое приложение (которое и пишу сейчас), там где екзешник программы находится папка Plug-in в которую закидывают библиотеки, в каждой реализован будет метод Load (например), а интерфейс имеет имя IPlugIn. Моё приложение проверяет библиотеки в этой папке и вызывает этот метод. (Библиотека изначально в реестре не зарегестрирована). Как это сделать? Может описать в моей программе вызываемый интерфейс (как правильно это описание сделать?) и создавать его экземпляр и обращаться к этому методу, но метод этот реализован по своему в каждой библиотеки(как правильно вызывать этот метод), а следовательно нужно вызывать метод именно из этой библиотеки. Я понимаю, что можно делать так
Но это работат естественно только для зарегестрированной в системе библиотеки, и если даже регестрировать её, то вызовится только последняя реализация Load. И при разработке плагинов вызовет трудности с созданием его, нужно будет копировать эти гьюды и цлсиды. А если не делать этого, то нужно как-то этот интерфей описывать по другому(как это сделать не знаю) естественно и вызывать иначе. Поэтому и инетересуюсь, если я знаю Имя интерфейса и имя метода(ов) реализующие этот интерфейс, как при загрузки библиотеки, изначально не зарегестрированной в системе, вызвать нужный мне метод, реализованный в этой библиотеки. Это сообщение отредактировал(а) Shtorm - 8.3.2009, 22:43 |
|||
|
||||
Rrader |
|
|||
Inspired =) ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1535 Регистрация: 7.5.2005 Репутация: 6 Всего: 191 |
||||
|
||||
Shtorm |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 23.2.2009 Где: Таганрог Репутация: нет Всего: 1 |
Rrader, Так я и делал, там идёт экспорт функции из библиотеки, мне интересно другое, если не эксортировать функции, и реализовать библиотеку как COM, то можно ли получить доступ к этому интерфейсу, зная только имя. Ну то есть мы экспортируем функцию в библиотеки как в том примере и вызываем её, зная её имя, меня это и интересует можно ли реализовать то же самое, но только без экспорта функции, зная имя интерфейса и функции или так нельзя делать?
![]() |
|||
|
||||
MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 3 Всего: 128 |
а как такое возможно, если подумать?
в итоге же всеравно библиотека экспортирует ряд функций для жизнеобеспечения работы встроенного COM-сервера. только это делается на уровне системы, и пользователь в коде сам не вызывает загрузку библиотеки и поиск нужной функции. так что остается выбрать: 1. Тяжеловесность COM, на 2 строки меньше кода 2. Быстроту и универсальность "ручной" загрузки библиотеки и поиск функции, на 2 строки больше кода. -------------------- There are always someone smarter than you... |
|||
|
||||
Shtorm |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 23.2.2009 Где: Таганрог Репутация: нет Всего: 1 |
Полазил по Drkb нашёл там хорошую статейку, как реализовать всё это без явного экспортирования функции с исользованием позднего и раннего связывания. В общем хорошая статейка в старой версии Drkb её не было. (©Drkb::04563)
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: ActiveX/СОМ/CORBA" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |