| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 |
| С задачей я справился сфмостоятельно но частично, и как обычно бывает вопросов только прибавилось... 1. Замучился искать мне дураку понятные примеры с методом Invoke. К сожалению не получилось его использовать (пришлось обойтись). Мне кажеться у меня проблема с передачей параметров метода (даже когда их и нет). Кто может, побалуйте хорошим примером плз. 2. Удаленно прога не находит сервера автоматизации, хотя для создания объекта использую метод CreateRemoteComObject и добавил удаленный компьютер в Службы компонентов. Что я не доделал, друзья, ну хоть намекните плз... |
| Автор: eof 30.5.2003, 16:24 |
| Fantasist, все так и сделал, но с пропертями проблема, они не хотят работать в виде Variant (ругаются что неверный параметр...), да и разобраться с Invoke, наверное, было бы правильние... |
| Автор: Fantasist 30.5.2003, 18:35 | ||||
Работа с Variant значительно удобнее. Разбираться с GetIDsOfNames и Invoke, может где-то и имеет смысл, но не думаю, что в прикладных задачах. При работе через variant компилятор сам сгенерит код для вызова GetIDsOfNames и Invoke, и если через variant не работает, то не заработает и при ручном вызове. Разве что при глюке в компиляторе, в чем я лично сильно сомневаюсь.
Какую ошибку выдает? |
| Автор: 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 - это вообще структура (запись, record) в которой первое поле - тип хранимого значение. В это поле записывается varDispatch, если ты присваеваешь значение типа IDispatch. После этого, в run-time, при попытке вызвать метод (проперти) через эту переменную проверяется, если это поле не равно varDispatch, то выбрасывается эта ошибка. Проверить, что за тип храниться в вариант, можно так:
|
| Автор: 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 | ||||
Это потому, что CreateRemoteComObject возвращает IUnknown, и в variant попадает указатель на интерфейс IUnknown (в поле типа записывается varUnknown)
Что значит на другом? Регестрировать точно так же, как и на этом. |
| Автор: eof 3.6.2003, 17:32 |
| Я понял все! (или почти все Спасибо. |