При неизвестном виде объекта obj обработка идет через GetIDsOfNames и Invoke. Причем имя метода PropName и параметры: 0 — 0. Всего один параметр. GetIDsOfNames возвратит, что такой метод имеется. И этому методу будут переданы параметры (какой-то, скорее всего, Integer или VT_I2) 0. Но метод не имеет (входных) параметров. Это ошибка обрашения к методу.
Здравствуйте, Vi2, Вы писали:
Vi2>Здравствуйте, mich_ael, Вы писали:
Vi2>
_>>В чем проблема?
Vi2>В разной обработке выражения obj.PropName(0).
Vi2>При неизвестном виде объекта obj обработка идет через GetIDsOfNames и Invoke. Причем имя метода PropName и параметры: 0 — 0. Всего один параметр. GetIDsOfNames возвратит, что такой метод имеется. И этому методу будут переданы параметры (какой-то, скорее всего, Integer или VT_I2) 0. Но метод не имеет (входных) параметров. Это ошибка обрашения к методу.
Однако это не метод. Это свойство возвращает массив.
_>Однако это не метод. Это свойство возвращает массив.
А ты можешь различить их? Я лично не берусь (без IDL/TLB описания).
a = p.Method(22,33)
a = p.Property(22,33)
Скрипты вообще над этим много не раздумывают — передают обобщенный индекс INVOKE_FUNC | INVOKE_PROPERTYGET для вызова функции-свойства, если не могут определить вид.
Дополнительно. Это свойство возвращает не массив, а Вариант. В котором ты передаешь массив, но можешь передать и не массив. Например, строку. Или число. Так что применение (0) после имени свойства просто не оправдано.
Здравствуйте, Vi2, Вы писали:
Vi2>Здравствуйте, mich_ael, Вы писали:
Vi2>
_>>... Это свойство возвращает массив.
Vi2>Дополнительно. Это свойство возвращает не массив, а Вариант. В котором ты передаешь массив, но можешь передать и не массив. Например, строку. Или число. Так что применение (0) после имени свойства просто не оправдано.
Ага. Чисто теоретически я все понял, но практической реализации того, что мне нужно не представляю. Если не затруднит показать как мне надо написать код, чтобы в итоге я получал нужный мне массив (а тем паче пояснить почему надо делать так, или иначе) — буду весьма признателен.
Re: возврат массивов из COM-объекта и клиенты late binding
_>Чисто теоретически я все понял, но практической реализации того, что мне нужно не представляю. Если не затруднит показать как мне надо написать код, чтобы в итоге я получал нужный мне массив (а тем паче пояснить почему надо делать так, или иначе) — буду весьма признателен.
Вариантов несколько. Я их привожу, но не проверяю.
1) можно ли сделать что-нибудь для того, чтобы избежать конструкции типа obj.PropName()(0), вместо нее вызывать просто элемент массива по индексу obj.PropName(0)?
2) В скрипте vbs получаю Type mismatch. Что сделать, чтобы пофиксить?
_>1) можно ли сделать что-нибудь для того, чтобы избежать конструкции типа obj.PropName()(0), вместо нее вызывать просто элемент массива по индексу obj.PropName(0)?
Конечно, можно. Разделить муху и котлету. Результат вызова свойства сохрани в переменной и используй ее. Но можешь поэкспериментировать в направлении