Показать сообщение отдельно
Старый 09.10.2002, 19:31   #1  
Maximin is offline
Maximin
NavAx
NavAx Club
 
409 / 341 (12) ++++++
Регистрация: 09.10.2002
Адрес: Москва
Передача массива VARIANTов в Automation метод
Есть проблема - нужно передать массив VARIANTов в метод объекта COM Automation.
Этот метод ожидает только это.
Я уже решил эту задачу даже на Visual C и API, но как это сделать на Аксапте?

Вот последовательность действий:
1. Создаем временный VARIANT.
2. Создаем SAFEARRAY.
3. Устанавливаем ему границы и заполняем, используя VARIANT, созданный в 1.
4. Создаем еще VARIANT с типом VT_ARRAY | VT_VARIANT.
5. Заносим в поле .parray VARIANTа, созданного в 4 дескриптор SAFEARRAYя.
6. Вызываем метод Automation с аргументов VARIANT из п 4.

Вот как выглядит последняя попытка на Axapta:

COMVariant cv= new COMVariant COMVariantInOut::IN_OUT,ComVariantType::VT_VARIANT);
Array myArray = new Array(Types::CLASS);
cv.int(4);
myArray.value(1,cv);
cv.bStr("My data");
myArray.value(2,cv);
cv.safeArray(intArray,ComVariantType::VT_VARIANT);
myobject.ThisTrickyMethod(cv); //calling Automation object method
// there's no difference, use COMDispFunction or not, result the same...

Этот объект Automation возвращает в Axapta ошибку:
"Функция ThisTrickyMethod возвратила код ошибки 0xDISP_E_TYPEMISMATCH,
что означает "Один или более параметров не могут быть преобразованы"".
Я знаю, что элементы этого массива уже не VARIANTы, но это последняя из многих моих попыток...

Я пробовал создавать VARIANTы как Binary(12) и т.д.., создавать и заполнять все структуры через вызовы API, как я делеал на C... все OK.
НО!.. когда я передаю VARIANT, созданный в Binary, в этот метод, Axapta показывает message box "Метод ThisTrickyMethod вызван с неправильными параметрами".

Главная проблема в том, что COMVariant не позволяет напрямую изменять свое содержание(т.е. структуру VT_VARIANT), чтобы установить поле .parray дескриптором созданного SAFEARRAY. ИЛИ, как-то провести преобразование типа Binary как VARIANT при вызове этого метода...

Этоот метод ожидает массив VARIANTов, но я не могу создать такую структуру данных в Axapta ... или я неправ?