AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.11.2004, 17:13   #1  
Tony Green is offline
Tony Green
Участник
Аватар для Tony Green
 
184 / 25 (1) +++
Регистрация: 08.10.2002
Адрес: Москва
? Как получить конкретный интерфейс COM объекта
Приветствую всех!

Вопрос из области интеграции с внешними приложениями. От этого внешнего приложения есть COM объект с толпой методов в различных интерфейсах.

Нужный метод находится в одном из них. Вопрос, как заполучить экземпляр класса COM в аксапте именно с нужным мне интерфейсом, а не с тем, который получается в результате команды new COM(....) ?
__________________
С уважением,
Tony Green
Старый 29.11.2004, 17:47   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Я конечно уже далек от этих вещей...
Но насколько я помню, если объект создан с учемтом стандартов COM, то у него должен быть реализован IDispatch и затем, этот интерфейс должен уметь возвращать другие интерфейсы.

Смотрите пример из руководства разработчика
PHP код:
Dim Axapta As Object
Dim MyObject 
As Object

Set Axapta 
CreateObject("AxaptaCOMConnector.Axapta")
Axapta.Logon
‘ create an Axapta object
Set MyObject 
Axapta.CreateObject("MyClass"
Обратите внимание на последний CreateObject
Именно так и должно работать ваше внешнее приложение, если оно действительно работает по стандартам COM.
А вот как конкретно получать интерфейсы - смотрите в доку вашего внешнего приложения.
Старый 29.11.2004, 18:00   #3  
Tony Green is offline
Tony Green
Участник
Аватар для Tony Green
 
184 / 25 (1) +++
Регистрация: 08.10.2002
Адрес: Москва
даже не с чем поспорить
в описании внешнего приложения приводится пример такого плана:
PHP код:
//Объявление компонента и интерфейсов
Dim Apl As Object
Dim iData 
As IApl_Data

//Создание компонента
Set Apl CreateObject(Неважно.что)

//Инициализация интерфейсов
Set iData Apl 
Вот таким образом получается ещё и iData из которого типа можно дергать его методы. Как это повторить в Axapta я ещё пока не придумал.
__________________
С уважением,
Tony Green
Старый 29.11.2004, 18:08   #4  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
COMDispFunction ?
Старый 29.11.2004, 18:13   #5  
maxsmirnov is offline
maxsmirnov
экс-модератор
 
268 / 25 (1) +++
Регистрация: 08.07.2003
Адрес: Москва
Цитата:
Изначально опубликовано mazzy
Но насколько я помню, если объект создан с учемтом стандартов COM, то у него должен быть реализован IDispatch и затем, этот интерфейс должен уметь возвращать другие интерфейсы.
причем он обернут в аксапте, в классе COM
protected final anytype dispatch(...)
Старый 29.11.2004, 18:17   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Согласен с Vadik.
Раннее связывание в классах Аксапты не реализовано.

Раннее связывание можно использовать только если вставить ActiveX на форму.
Но для этого COM-объект должен быть и ActiveX-объектом.

Либо COMDispFunction, как говорил Vadik
либо COM::createFromInterface, COM::createFromVariant
Но потрахаться вам придется во всех случаях.

Может таки есть способ использовать строковый идентификатор в вашем внешнем приложении?
Старый 29.11.2004, 18:23   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано 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 код:
public comInterface interface()
Arguments
Returns 
The COM interface of the attached COM object

Remarks
This method is 
for the experienced programmer and it should be used with great caution.
The interface property is read-only
Example
{
    
COM com1 = new COM("MyCOM.Object");
    
COM com2 = new COM("MySecondCOM.Object");
    
COMVariant varObject = new COMVariant();

    
COMInterface comInterface;
    
comInterface com1.interface();
    
varObject.iDispatch(comInterface);
 
    
com2.setObject(varObject); // give 'com2' the 'com1' object
 
    // or
 
    
com2.setObject(com1); // give 'com2' the 'com1' object

Старый 29.11.2004, 18:40   #8  
maxsmirnov is offline
maxsmirnov
экс-модератор
 
268 / 25 (1) +++
Регистрация: 08.07.2003
Адрес: Москва
Цитата:
Изначально опубликовано 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  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
у меня ax3.0 sp3 cu1
Старый 30.11.2004, 05:14   #10  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
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  
Tony Green is offline
Tony Green
Участник
Аватар для Tony Green
 
184 / 25 (1) +++
Регистрация: 08.10.2002
Адрес: Москва
Re: Re: Как получить конкретный интерфейс COM объекта
Цитата:
Изначально опубликовано Alks


Если коротко: НИКАК.
А вот такой вариант: у каждого COM объекта обязательно есть замечательная функция QueryInterface, которая по GUID возвращает указатель на интерфейс?

Только как скормить из аксапты 128-и битную структуру функции QueryInterface я ещё пока тоже не придумал
__________________
С уважением,
Tony Green
Старый 01.12.2004, 15:54   #12  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
И не надейтесь.
Еще раз повторяю - Аксапта умеет работать только с интерфейсом IDispatch! То что в IDispatch присутствует метод QueryInterface может сбить с толку, но на самом деле это просто последствия того что называется "дуальными интерфейсами", когда методы забитые в нативный ком-интерфейс, наследующий от IDispatch прописываются в таблицах диспетчеризированных методов. Потом эти методы можно будет вызывать как низкоуровневыми методами из таких языков как C++ или Delphi непосредственно обращаясь к интерфейсу объекта, наследующего от IDispatch + можно будет вызывать эти методы через IDispatch.Invoke, как это делает аксапта и другие скриптовые языки. Так что Аксапта не будет знать что делать с тем результатом, который QueryInterface вернет вам.
Старый 01.12.2004, 18:24   #13  
Tony Green is offline
Tony Green
Участник
Аватар для Tony Green
 
184 / 25 (1) +++
Регистрация: 08.10.2002
Адрес: Москва
т.е. даже если это и ActiveX компонент и мы имеем раннее связывание в аксапте, то всё равно это не поможет и для интеграции придется писать прослойку на Delphi, к примеру?
__________________
С уважением,
Tony Green
Старый 01.12.2004, 19:02   #14  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
// глюки связи.
Старый 01.12.2004, 19:03   #15  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано Tony Green
т.е. даже если это и ActiveX компонент и мы имеем раннее связывание в аксапте, то всё равно это не поможет и для интеграции придется писать прослойку на Delphi, к примеру?
Аксапта поддерживает ActiveX-контролы, позволяя встраивать их в свои формы. На своём низком уровне она знает какие интерфейсы надо поддерживать для этого - но это не означает раннее связывание! Просто движок аксапты поддерживает ActiveX-компоненты, так же как и например IDE Visual Basic-а. Однако из X++ вы можете работать только с IDispatch (по крайней мере я не видел исключаний). Заметьте, что основной интерфейс ActiveX-компонентов как правило дуален (т.е. наследует от IDIspatch), так что вы можете обращятся к свойствам и методам ActiveX-контролов и из X++.
Я намеренно употребляю название ActiveX-контрол, т.к. слово ActiveX зачастую неправильно используется, как обозначение совершенно любого COM-объекта, поддерживающего интерфейс IDispatch. На самом деле в технологии COM имеется приличная путаница терминологий.
Старый 01.12.2004, 19:10   #16  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Изначально опубликовано Alks
Аксапта поддерживает ActiveX-контролы, позволяя встраивать их в свои формы. На своём низком уровне она знает какие интерфейсы надо поддерживать для этого - но это не означает раннее связывание! Просто движок аксапты поддерживает ActiveX-компоненты, так же как и например IDE Visual Basic-а. Однако из X++ вы можете работать только с IDispatch (по крайней мере я не видел исключаний).
Разве только IDispatch?
Пример - форма smmEncyclopedia.
Разве здесь не происходит раннее связывание?

Вложения
Тип файла: img52455-1 (24.7 Кб, 1034 просмотров)
Старый 02.12.2004, 05:58   #17  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано mazzy

Разве только IDispatch?
Пример - форма smmEncyclopedia.
Разве здесь не происходит раннее связывание?
[fig1]
Ну как сказать... В COM есть 2 вида раннего связывания, но я не думаю что какой нибудь из них используется в Аксапте...
С помощью утилиты OleView посмотрим что из себя представляет COM-объект smmDropWin.
Видно что у этого объекта 2 интерфейса, оба наследующих от IDispatch - один интерфейс - это собственно сами методы и свойства объекта, которые будут доступны из кода X++, а второй - это его события, на которые Аксапта может вешать свои обработчики. Интерфейс событий наз-ся так же как и основной интерфейс объекта с префиксом _.
И хотя в рассматриваемой нами библиотеке типов COM не показано что объект имеет еще какие то интерфейсы, но на самом деле он реализует еще несколько "низкоуровневых" (имеются ввиду не пронаследованные от IDispatch) интерфейсов типа IConnectionPointContainer, через которые собственно Аксапта и узнаёт какой из интерфейсов является интерфейсом событий, коннектится к нему в рантайме и вешает на него свои обработчики. К "раннему связыванию" в привычном для программирования COM-объектов смысле этот процесс отношения имеет мало.
Старый 02.12.2004, 05:59   #18  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано mazzy

Разве только IDispatch?
Пример - форма smmEncyclopedia.
Разве здесь не происходит раннее связывание?

Вложения
Тип файла: img52481-1 (56.8 Кб, 1276 просмотров)
Старый 02.12.2004, 08:32   #19  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Спасибо.
Старый 02.12.2004, 09:49   #20  
Diman is offline
Diman
Участник
Сотрудники Microsoft Dynamics
 
166 / 35 (2) +++
Регистрация: 27.06.2003
Адрес: Москва
А можно и мне свои 5...
Цитата:
Изначально опубликовано Alks

К "раннему связыванию" в привычном для программирования COM-объектов смысле этот процесс отношения имеет мало.
Еще есть библиотека типов, которая и содержит описание всех интефейсов их методов и параметров. И есть функции в COM run-time, которые позволяют работать с этой библиотекой.
Так что одним IDispatch дело не ограничивается
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Мониторинг состояния COM объекта axaLearner DAX: Программирование 5 10.04.2008 16:39
E-mail в Аксапте 3.0 с помощью CDO.Message COM объекта custtable DAX: Программирование 4 12.02.2008 10:31
Передача агументов в функцию com объекта doo DAX: Программирование 34 30.01.2007 13:14
Проблема с получение коллекции (массива) из COM-объекта. VES DAX: Программирование 6 24.03.2006 18:59

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 12:06.