Может ли ошибка несоответствия типов из VBScript, вызванная оценкой не вариантного массива, возвращаемого интерфейсом COM, быть решена путем изменения языков? - PullRequest
0 голосов
/ 08 июля 2019

Я использую приложение Windows, которое предоставляет интерфейс COM для сценариев расширения. Скудная документация содержит несколько примеров в VBScript, поэтому я начал внедрять свою автоматизацию в VBScript.

Это будет выглядеть примерно так:

Set App = GetObject(, "MYAPP.Application")
MyObj = App.Object
MyArr = MyObj.ArrData

IsArray(MyArr)  ' True
TypeName(MyArr) ' Long()
Lbound(MyArr)   ' 0
Ubound(MyArr)   ' 10
MyArr(1)        ' Type Mismatch Error

При ближайшем рассмотрении объект массива имеет тип Long () (Array of Longs). После изучения проблемы, насколько я понимаю, VBScript не может получить доступ к элементам массива по индексу, если массив не имеет тип Variant; что это ограничение VBScript как языка. Я не могу внести изменения, как в этом ответе , потому что у меня нет доступа к исходному приложению, которое я пытаюсь расширить.

Является ли ошибка, которую я вижу, чисто ограничением языка? Смогу ли я получить доступ к переменным массива, возвращаемым интерфейсом COM, перенеся мой код на другой язык, например C #, например?

1 Ответ

0 голосов
/ 09 июля 2019

Я подтвердил, что перенос на C # устраняет ошибку несоответствия типов, возникающую при доступе к неизменяемым данным массива, возвращаемым интерфейсом COM, без необходимости изменения COM-сервера.

После включения соответствующих ссылок код становится:

var app = (MYAPP.Application)Microsoft.VisualBasic.Interaction.GetObject(null, "MYAPP.Application");
var myObj = (MYAPP.Obj) app.GetObject();
var myArr = (int[]) myObj.GetArrData();
if (myArr.Length() > 0)
{
    System.Console.WriteLine(myArr[0]); // prints value at index 0 without error
}

Следовательно, ограничение относится к VBScript; несоответствие типов связано с тем, что язык способен обрабатывать только массивы типов вариантов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...