Как переслать массив данных из Web-клиента в СОМ и обратно?
От: Аноним  
Дата: 14.02.03 16:10
Оценка:
Суть в следующем: есть ActiveX, который используется в Web приложении. Надо передать в него массив данных, ActiveX должен его заполнить и вернуть клиенту. Вызов метода поисходит из ActiveX. Например так:

Dim LongArray(5)
LongArray(0) = CLng(0)
MyActiveX.ArrayF(LongArray)

VBScript по идее должен запаковать массив в SAFEARRAY, что, вроде так и происходит.
В функции ArrayF я должен был бы увидеть тип параметра примерно такой VT_ARRAY | VT_...
Но это не так. Тип параметра не определен (VStudio показывает ???). Попытки работать с тем, что есть, оканчиваются исключением. ArrayF описана так :
HRESULT ArrayF([in]VARIANT * pArray)
Что делать?
Еще непонятно следующее:
Если вызвать такую функцию
HRESULT ArrayF2([in]VARIANT Array)
то тип параметра получается VT_VARIANT|VT_BYREF, несмотря на то, что в клиенте елементы массива инициализировались строками (должно быть VT_BSTR|VT_BYREF).
Re: Как переслать массив данных из Web-клиента в СОМ и обрат
От: Ivan Россия www.rsdn.ru
Дата: 14.02.03 16:20
Оценка: 21 (1)
Здравствуйте, Аноним, Вы писали:

А>Dim LongArray(5)

А>LongArray(0) = CLng(0)
А>MyActiveX.ArrayF(LongArray)

А>VBScript по идее должен запаковать массив в SAFEARRAY, что, вроде так и происходит.

А>В функции ArrayF я должен был бы увидеть тип параметра примерно такой VT_ARRAY | VT_...
А>Но это не так.

Скрипт будет передавать тебе такой массив как массив вариантов, т.е VT_ARRAY | VT_VARIANT | VT_BYREF
а уже в вариантах будут лежать числа

А>Еще непонятно следующее:

А>Если вызвать такую функцию
А>HRESULT ArrayF2([in]VARIANT Array)
А>то тип параметра получается VT_VARIANT|VT_BYREF, несмотря на то, что в клиенте елементы массива инициализировались строками (должно быть VT_BSTR|VT_BYREF)

Все массивы (и входные и выходные) в VBScript'е состоят из вариантов, это by design
Re[2]: Как переслать массив данных из Web-клиента в СОМ и об
От: Аноним  
Дата: 15.02.03 07:56
Оценка:
Здравствуйте, Ivan, Вы писали:


I>Скрипт будет передавать тебе такой массив как массив вариантов, т.е VT_ARRAY | VT_VARIANT | VT_BYREF

I>а уже в вариантах будут лежать числа

Ты подтверждаешь то, что я уже сказал. Массив упаковывается скриптов в вариант, внутри которого лежит safearray. Но вопрос остается открытым: как описать набор параметров интерфейсной функции (для двух вариантов: для передачи массива (как бы) по значения и (как бы) по указателю)? И если я их описал правильно, то почему тип параметра внутри функции остается неоперделенным?

I>Все массивы (и входные и выходные) в VBScript'е состоят из вариантов, это by design

Под этим можно даже кровью подписаться.
Re[3]: Как переслать массив данных из Web-клиента в СОМ и об
От: Bullet Россия  
Дата: 17.02.03 05:06
Оценка: 6 (1)
Здравствуйте, <Аноним>, Вы писали:

I>>Скрипт будет передавать тебе такой массив как массив вариантов, т.е VT_ARRAY | VT_VARIANT | VT_BYREF

I>>а уже в вариантах будут лежать числа
А>Ты подтверждаешь то, что я уже сказал. Массив упаковывается скриптов в вариант, внутри которого лежит safearray. Но вопрос остается открытым: как описать набор параметров интерфейсной функции (для двух вариантов: для передачи массива (как бы) по значения и (как бы) по указателю)?

может ты имеешь в виду это?

STDMETHODIMP CExportPack::AddExportPackToDBF( ULONG ab_id, VARIANT * pack_id )
{
...
SAFEARRAY* psa = NULL
if ( pack_id->vt & VT_BYREF )
psa = *(pack_id->pparray);
else
psa = pack_id->parray;
...
}

И если я их описал правильно, то почему тип параметра внутри функции остается неоперделенным?

по-моему это отладчик прогоняет и не показывает VT_ARRAY | VT_BYREF | VT_VARIANT
... << RSDN@Home 1.0 beta 5 >>
WBR, Max.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.