29.05.2003, 17:11 | #1 |
Участник
|
Проблема с получение коллекции (массива) из COM-объекта.
Уважаемые коллеги!
Просьба помочь в таком нетривиальном вопросе, как получение из COM-объекта коллекции. Есть COM-объект, у которого есть метод Items - коллекция. Когда получаю элементы этой коллекции, к примеру, на VB, DIM obj as Variant For Each obj In ComObj.Items MsgBox obj.Name Next все работает отлично. Когда я пытаюсь сделать то же самое из Аксапты, делаю так: COMVariant cv = ComObj.Items(); то cv - пустой вариант (( Так как же мне получить коллекцию, какой тип использовать слева от присваивания??? Попытки Container и COM[] - не проходят... |
|
30.05.2003, 10:37 | #2 |
Moderator
|
У меня была такая же проблема. Вот здесь: http://www.axforum.info/forums/showt...ghlight=Source
Там в самом конце, я описываю возникшие проблемы. В том числе там есть код с констукцией for each. Перевести на Аксапту я его тоже не смог Но там же я привел этот же код на VC(ATL) - посмотри, может натолкнет на какие-нибудь мысли. На самом деле там используются enum'ераторы (правильнее наверное итераторы . VB конструкция "for each" красиво прячет от программиста эту сложность/тонкость. Не Аксапта, не VC не предоставляют такой возможности, поэтому наверное стоит смотреть на VC реализацию и думать, как это реализовать в Аксапте. Если все-таки решишь эту проблему - пожалуйста, сообщи мне. Буду очень благодарен. |
|
30.05.2003, 10:56 | #3 |
Участник
|
В интрефейсах COM у объекта может стоять по умолчанию какое то свойство, которое вызывается.. при доступе к данному объекту, Visual Basic автоматически обращается к этому свойству, например мы можем писать
o.Items(2) и Visual Basic автоматом берет значение свойства по умолчанию у объекта Items а в Аксапте нужно писать COMVariant v; COM items; items = o.Items(2); v = items.Value; я не уверен но может быть поможет |
|
30.05.2003, 11:59 | #4 |
Moderator
|
В моем случае это не помогло
Вообще-то в Аксапте есть классы ComEnum2Object и ComEnum2Variant. Вот что написано про первый из них: Цитата:
The COMEnum2Variant class is used to enumerate a collection of COM objects. COM Automation objects often use collections. The COM objects that are found in the collection must support COM Automation to be useful in Axapta.
По-моему он так какие-то ошибки постоянно выбрасывал... |
|
30.05.2003, 12:07 | #5 |
Участник
|
Точно-точно
Да, абсолютно верно, у меня тоже самое, пишет "Метод был вызван с неверным параметром" - это он ругается на o.Items(2)
|
|
24.03.2006, 18:46 | #6 |
Участник
|
ComEnum2Object
Всё замечательно работает, просто объект надо создавать через COM::getObjectEx()... Не знаю, может я не о том, но: COM objNamespace, objDomain; COMEnum2Object COMEnum; objNamespace = COM::getObjectEx("WinNT:"); objNamespace.Filter("domain"); COMEnum = new COMEnum2Object(objNamespace); objDomain = COMEnum.getFirst(); while (objDomain) { info(objDomain.Name()); objDomain = COMEnum.getNext(); } |
|
24.03.2006, 18:59 | #7 |
Microsoft Dynamics
|
Попробуйте написать следующим образом:
Код: COMVariant itemVariant; COM items; items = ComObject.Items(); itemVariant = items.item(2); Последний раз редактировалось Jabberwocky; 24.03.2006 в 19:01. |
|
|
Похожие темы | ||||
Тема | Ответов | |||
Проблема с импортом из Excel через COM | 18 | |||
Мониторинг состояния COM объекта | 5 | |||
Передача агументов в функцию com объекта | 34 | |||
Передача массива в метод COM-объекта | 6 |
|