29.11.2004, 17:13 | #1 |
Участник
|
Как получить конкретный интерфейс COM объекта
Приветствую всех!
Вопрос из области интеграции с внешними приложениями. От этого внешнего приложения есть COM объект с толпой методов в различных интерфейсах. Нужный метод находится в одном из них. Вопрос, как заполучить экземпляр класса COM в аксапте именно с нужным мне интерфейсом, а не с тем, который получается в результате команды new COM(....) ?
__________________
С уважением, Tony Green |
|
29.11.2004, 17:47 | #2 |
Участник
|
Я конечно уже далек от этих вещей...
Но насколько я помню, если объект создан с учемтом стандартов COM, то у него должен быть реализован IDispatch и затем, этот интерфейс должен уметь возвращать другие интерфейсы. Смотрите пример из руководства разработчика PHP код:
Именно так и должно работать ваше внешнее приложение, если оно действительно работает по стандартам COM. А вот как конкретно получать интерфейсы - смотрите в доку вашего внешнего приложения. |
|
29.11.2004, 18:00 | #3 |
Участник
|
даже не с чем поспорить
в описании внешнего приложения приводится пример такого плана: PHP код:
__________________
С уважением, Tony Green |
|
29.11.2004, 18:08 | #4 |
Модератор
|
COMDispFunction ?
|
|
29.11.2004, 18:13 | #5 |
экс-модератор
|
Цитата:
Изначально опубликовано mazzy
Но насколько я помню, если объект создан с учемтом стандартов COM, то у него должен быть реализован IDispatch и затем, этот интерфейс должен уметь возвращать другие интерфейсы. protected final anytype dispatch(...) |
|
29.11.2004, 18:17 | #6 |
Участник
|
Согласен с Vadik.
Раннее связывание в классах Аксапты не реализовано. Раннее связывание можно использовать только если вставить ActiveX на форму. Но для этого COM-объект должен быть и ActiveX-объектом. Либо COMDispFunction, как говорил Vadik либо COM::createFromInterface, COM::createFromVariant Но потрахаться вам придется во всех случаях. Может таки есть способ использовать строковый идентификатор в вашем внешнем приложении? |
|
29.11.2004, 18:23 | #7 |
Участник
|
Цитата:
Изначально опубликовано maxsmirnov
причем он обернут в аксапте, в классе COM protected final anytype dispatch(...) Хелп в 3.0 пишет "COM.dispatch Run on: Called Description The dispatch method is a reserved system method, which should not be called explicitly." Может имел в виду PHP код:
|
|
29.11.2004, 18:40 | #8 |
экс-модератор
|
Цитата:
Изначально опубликовано mazzy
Description The dispatch method is a reserved system method, which should not be called explicitly. а у меня в хелпе такого дескрипшена нет (ах 3.0 сп3 хф2) |
|
29.11.2004, 18:53 | #9 |
Участник
|
у меня ax3.0 sp3 cu1
|
|
30.11.2004, 05:14 | #10 |
Участник
|
Re: Как получить конкретный интерфейс COM объекта
Цитата:
Изначально опубликовано Tony Green
Приветствую всех! Вопрос из области интеграции с внешними приложениями. От этого внешнего приложения есть COM объект с толпой методов в различных интерфейсах. Нужный метод находится в одном из них. Вопрос, как заполучить экземпляр класса COM в аксапте именно с нужным мне интерфейсом, а не с тем, который получается в результате команды new COM(....) ? Если поподробнее: Аксапта поддерживает только COM-объекты автоматизации, или по другому объекты диспетчеризации. Работа с такими COM-объектами происходит через один и единственный интерфейс IDispatch, который в специальной манере реализует метод Invoke через который и происходит вызов методов с заранее неизвестными именами и неизвестным количеством параметров. Напрямую работать с любыми другими COM-интерфейсами Аксапта (насколько мне известно) не умеет, ибо это предполагает наличие поддержки раннего связывания в компиляторе и много другого. Замечу в этом Аксапта в этом не одинока - это подход всех скриптовых языков (VBScript, JavaScript, внутренний язык 1С и пр.), для которых в общем то IDispatch и разрабатывался. |
|
|
За это сообщение автора поблагодарили: Logger (1). |
01.12.2004, 15:31 | #11 |
Участник
|
Re: Re: Как получить конкретный интерфейс COM объекта
Цитата:
Изначально опубликовано Alks
Если коротко: НИКАК. Только как скормить из аксапты 128-и битную структуру функции QueryInterface я ещё пока тоже не придумал
__________________
С уважением, Tony Green |
|
01.12.2004, 15:54 | #12 |
Участник
|
И не надейтесь.
Еще раз повторяю - Аксапта умеет работать только с интерфейсом IDispatch! То что в IDispatch присутствует метод QueryInterface может сбить с толку, но на самом деле это просто последствия того что называется "дуальными интерфейсами", когда методы забитые в нативный ком-интерфейс, наследующий от IDispatch прописываются в таблицах диспетчеризированных методов. Потом эти методы можно будет вызывать как низкоуровневыми методами из таких языков как C++ или Delphi непосредственно обращаясь к интерфейсу объекта, наследующего от IDispatch + можно будет вызывать эти методы через IDispatch.Invoke, как это делает аксапта и другие скриптовые языки. Так что Аксапта не будет знать что делать с тем результатом, который QueryInterface вернет вам. |
|
01.12.2004, 18:24 | #13 |
Участник
|
т.е. даже если это и ActiveX компонент и мы имеем раннее связывание в аксапте, то всё равно это не поможет и для интеграции придется писать прослойку на Delphi, к примеру?
__________________
С уважением, Tony Green |
|
01.12.2004, 19:02 | #14 |
Участник
|
// глюки связи.
|
|
01.12.2004, 19:03 | #15 |
Участник
|
Цитата:
Изначально опубликовано Tony Green
т.е. даже если это и ActiveX компонент и мы имеем раннее связывание в аксапте, то всё равно это не поможет и для интеграции придется писать прослойку на Delphi, к примеру? Я намеренно употребляю название ActiveX-контрол, т.к. слово ActiveX зачастую неправильно используется, как обозначение совершенно любого COM-объекта, поддерживающего интерфейс IDispatch. На самом деле в технологии COM имеется приличная путаница терминологий. |
|
01.12.2004, 19:10 | #16 |
Участник
|
Цитата:
Изначально опубликовано Alks
Аксапта поддерживает ActiveX-контролы, позволяя встраивать их в свои формы. На своём низком уровне она знает какие интерфейсы надо поддерживать для этого - но это не означает раннее связывание! Просто движок аксапты поддерживает ActiveX-компоненты, так же как и например IDE Visual Basic-а. Однако из X++ вы можете работать только с IDispatch (по крайней мере я не видел исключаний). Пример - форма smmEncyclopedia. Разве здесь не происходит раннее связывание? |
|
02.12.2004, 05:58 | #17 |
Участник
|
Цитата:
Изначально опубликовано mazzy
Разве только IDispatch? Пример - форма smmEncyclopedia. Разве здесь не происходит раннее связывание? [fig1] С помощью утилиты OleView посмотрим что из себя представляет COM-объект smmDropWin. Видно что у этого объекта 2 интерфейса, оба наследующих от IDispatch - один интерфейс - это собственно сами методы и свойства объекта, которые будут доступны из кода X++, а второй - это его события, на которые Аксапта может вешать свои обработчики. Интерфейс событий наз-ся так же как и основной интерфейс объекта с префиксом _. И хотя в рассматриваемой нами библиотеке типов COM не показано что объект имеет еще какие то интерфейсы, но на самом деле он реализует еще несколько "низкоуровневых" (имеются ввиду не пронаследованные от IDispatch) интерфейсов типа IConnectionPointContainer, через которые собственно Аксапта и узнаёт какой из интерфейсов является интерфейсом событий, коннектится к нему в рантайме и вешает на него свои обработчики. К "раннему связыванию" в привычном для программирования COM-объектов смысле этот процесс отношения имеет мало. |
|
02.12.2004, 05:59 | #18 |
Участник
|
Цитата:
Изначально опубликовано mazzy
Разве только IDispatch? Пример - форма smmEncyclopedia. Разве здесь не происходит раннее связывание? |
|
02.12.2004, 08:32 | #19 |
Участник
|
Спасибо.
|
|
02.12.2004, 09:49 | #20 |
Участник
|
А можно и мне свои 5...
Цитата:
Изначально опубликовано Alks
К "раннему связыванию" в привычном для программирования COM-объектов смысле этот процесс отношения имеет мало. Так что одним IDispatch дело не ограничивается |
|