Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Зацепить Dll


Автор: eof 30.5.2003, 12:26
Друзья!
расскажите плз. как сделать следующее:
на одном компе есть набор Dll (ActiveX Library),
на другом компе есть прога которая должна использовать некоторые из тех самых dllей с другого компа... причем какие именно проге становиться известно только во время выполнения...
короче Guidы интерфейсов я узнаю только во время выполнения. Все интерфейсы одинаковы по набору методов (имена и идентификаторы методов одинаковы и известны). Каким образом я могу выполнить какойньть метод в проге (заранее не декларируя интерфейсов)...
во блин...

Автор: Fantasist 30.5.2003, 16:14
Цитата
Каким образом я могу выполнить какойньть метод в проге (заранее не декларируя интерфейсов)...


Если не декларируя то IDispatch. Другими словами в Делфи - variant.

Автор: eof 30.5.2003, 16:21
С задачей я справился сфмостоятельно но частично, и как обычно бывает вопросов только прибавилось...sad.gif
1. Замучился искать мне дураку понятные примеры с методом Invoke. К сожалению не получилось его использовать (пришлось обойтись). Мне кажеться у меня проблема с передачей параметров метода (даже когда их и нет). Кто может, побалуйте хорошим примером плз.
2. Удаленно прога не находит сервера автоматизации, хотя для создания объекта использую метод CreateRemoteComObject и добавил удаленный компьютер в Службы компонентов. Что я не доделал, друзья, ну хоть намекните плз...

Автор: eof 30.5.2003, 16:24
Fantasist, все так и сделал, но с пропертями проблема, они не хотят работать в виде Variant (ругаются что неверный параметр...), да и разобраться с Invoke, наверное, было бы правильние...

Автор: Fantasist 30.5.2003, 18:35
Цитата
они не хотят работать в виде Variant (ругаются что неверный параметр...), да и разобраться с Invoke, наверное, было бы правильние...


Работа с Variant значительно удобнее. Разбираться с GetIDsOfNames и Invoke, может где-то и имеет смысл, но не думаю, что в прикладных задачах. При работе через variant компилятор сам сгенерит код для вызова GetIDsOfNames и Invoke, и если через variant не работает, то не заработает и при ручном вызове. Разве что при глюке в компиляторе, в чем я лично сильно сомневаюсь.

Цитата
2. Удаленно прога не находит сервера автоматизации, хотя для создания объекта использую метод


Какую ошибку выдает?


Автор: man2002ua 30.5.2003, 19:14
Fantasist, давай пример работы мс судаленнным актив икс1! Пожалустав!

Автор: eof 2.6.2003, 09:23
Fantasist Класс не зарегистрирован (по русски на Win2000 Pro Rus)

Автор: eof 2.6.2003, 11:33
Через Variant методы выпоняются на ура. но с пропертями беда. Пишет что параметр неверно задан или чтото типа элемент отсутствует в группе.
И еще приходиться извращаться чтобы создать экземпляр. если делать влоб, то вылетает ошибка о том что variant doesn't reference an automation object....
Ну никак не врублюсь как это работает, чтож я такой тупой то...

Автор: Fantasist 2.6.2003, 21:13
Цитата
Класс не зарегистрирован


Это ошибка самая простая и понятная и означает именно это - класс не зарегистрирован. То есть виндос не может найти в реестре ключи для твоего объекта. Класс надо зарегестрировать (например программкой regsvr32).


Цитата
Пишет что параметр неверно задан или чтото типа элемент отсутствует в группе


Это скорее всего, ты неправильно написал имя проперти, если это ексепшен на обращение к ней. Правда, может быть, сам ActiveX выдает ошибку из-за неправильного с ним обращения. Конкретно без ошибки тяжело сказать.

Цитата
И еще приходиться извращаться чтобы создать экземпляр. если делать влоб, то вылетает ошибка о том что variant doesn't reference an automation object....


Как же ты его создаешь?

Variant - это вообще структура (запись, record) в которой первое поле - тип хранимого значение. В это поле записывается varDispatch, если ты присваеваешь значение типа IDispatch. После этого, в run-time, при попытке вызвать метод (проперти) через эту переменную проверяется, если это поле не равно varDispatch, то выбрасывается эта ошибка.

Проверить, что за тип храниться в вариант, можно так:
Код

var
 v:variant
begin
......
TVarData(v).vType;
....
end;

Автор: eof 3.6.2003, 09:13
Fantasist Спасибо за рассказ про Variant... это многое объясняет. Пропертя работают, но не все... не могу использовать проперть типа TGuid (на ней то и материться про "Параметр задан неверно").
Создавать экземпляр было тяжело, но потом догадался:
var
y: Variant;
begin
y := CreateRemoteComObject('CompName', CLASS_dll) as IDispatch;
без приведения к IDispatch надо было извращаться.
Но самая проблема это про "Класс не зарегестрирован". я еще раз хочу отметить что dll находиться на др. компе (в одном домене). в хелпе прочитал про настройки службы компонентов. вроде бы все сделал, но... не выходит. Расскажи плз. как регестрить dll которые на др. компе?

Автор: Fantasist 3.6.2003, 17:16
Цитата
y := CreateRemoteComObject('CompName', CLASS_dll) as IDispatch;
без приведения к IDispatch надо было извращаться.


Это потому, что CreateRemoteComObject возвращает IUnknown, и в variant попадает указатель на интерфейс IUnknown (в поле типа записывается varUnknown)

Цитата
как регестрить dll которые на др. компе?


Что значит на другом? Регестрировать точно так же, как и на этом.

Автор: eof 3.6.2003, 17:32
Я понял все! (или почти всеsmile.gif) о как в начале заблуждался я...
Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)