Помогите пожалуста разобраться. Каким образом можно передать массив вариантов (на самом деле там будут храниться целые числа) из клиентской программы написанной на VB в программу которая преставляет собой компонент ActiveX. Так же как принять этот массив в ActiveX-е ? Визард ActiveX показывает, что можно задать тип VARIANT, а вот как передать массив вариантов (тобиш собственный тип через COM как передать) ? Заранее спасибо.
Здравствуйте AndyZ, вы писали:
AZ>Помогите пожалуста разобраться. Каким образом можно передать массив вариантов (на самом деле там будут храниться целые числа) из клиентской программы написанной на VB в программу которая преставляет собой компонент ActiveX. Так же как принять этот массив в ActiveX-е ? Визард ActiveX показывает, что можно задать тип VARIANT, а вот как передать массив вариантов (тобиш собственный тип через COM как передать) ? Заранее спасибо.
Читай про SAFEARRAY (в MSDN и в этих конфах).
А по вопросу... так что собственно нужно? А то у вас каша какая-то. :(
Массив целых — это массив целых... вариант — вариант... и что Вы понимаете под названием "собственный тип"?
В IDL массив целых это: [in] SAFEARRAY(long) psaInt
массив вариантов [in] SAFEARRAY(VARIANT) psaVar
своих структур: [in] SAFEARRAY(MyStruct) psaMyStruct
своих структур по ссылке: [in, out] SAFEARRAY(MyStruct) * ppsaMyStruct
ну и так далее...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте AndyZ, вы писали:
AZ>Помогите пожалуста разобраться. Каким образом можно передать массив вариантов (на самом деле там будут храниться целые числа) из клиентской программы написанной на VB в программу которая преставляет собой компонент ActiveX. Так же как принять этот массив в ActiveX-е ? Визард ActiveX показывает, что можно задать тип VARIANT, а вот как передать массив вариантов (тобиш собственный тип через COM как передать) ? Заранее спасибо.
IMHO SafeArray лучше передавать через VARIANT т.е. запихнуть в вариант ссылку на энтот самый массив
STDMETHODIMP Func(/*[out, retval]*/ VARIANT *pFieldsNamesArray)
{
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];
VARIANT var;
VariantInit(&var);
var.vt = VT_BSTR; //здесь указываем тот тип который забиваем в массив
Для работы в скриптовых языках, не лучше, а обязательно через VARIANT. Для остальных случаев как раз лучше по-нормальному (комплит ворды, контроль при компиляции, скорость работы... знаете ли ;o) ).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Спасибо всем за ответы. С массивом вариантов (VT_ARRAY |VT_I4) разобрался , все оказалось не так сложно. Вот единственное что осталось так это научиться задавать массив сразу на VB. Если вопрос не сюда, сильно не бейте. Если бы клиент был написан на VC++, проблем нет одним махом (сразу все элементы без обращения по индексу) задается вариантный массив, который превращается в SAFEARRAY. А вот в бэйсике можно задать только одномерный массив DIM A= Array (1,4,5,6,7). А как задать двумерный (многомерный)?
Здравствуйте VladD2, вы писали:
VD>Здравствуйте Bailif.
VD>Для работы в скриптовых языках, не лучше, а обязательно через VARIANT. Для остальных случаев как раз лучше по-нормальному (комплит ворды, контроль при компиляции, скорость работы... знаете ли ;o) ).
— IMHO "остальные" случаи составляют как правило исключения, 80% компонентов пишется для использования скриптами — в таком виде поймет и VB и VBS. Просто я сам набил на этом кучу шишек и нехочу чтобы это делали другие...
Относительно "лучше" — согласен ошибочка вышла...
Здравствуйте Bailif, вы писали:
B>Здравствуйте VladD2, вы писали:
VD>>Здравствуйте Bailif.
VD>>Для работы в скриптовых языках, не лучше, а обязательно через VARIANT. Для остальных случаев как раз лучше по-нормальному (комплит ворды, контроль при компиляции, скорость работы... знаете ли ;o) ).
B>- IMHO "остальные" случаи составляют как правило исключения, 80% компонентов пишется для использования скриптами — в таком виде поймет и VB и VBS. Просто я сам набил на этом кучу шишек и нехочу чтобы это делали другие... B>Относительно "лучше" — согласен ошибочка вышла...
Вы заблуждаетесь. Скрипты реально применяются в основном в ASP, а с появлением ASP.Net надобность в них отпадает. На ASP свет клином не сошолся. Вот и вопрос "массив вариантов передать в ActiveX" говорит о том, что человеку он не нужен. А за универсальность приходится платить неудобствами (о которых я уже говорил). Так, что, все же, лучше выбирать путь под задачу. Если заранее не известно где будет применяться объект, то конечно лучше использовать вариант. Если точно известно, что получать в скрипте массив не прийдется, лучше делать более корректное объявление. Вот небольшой список приожений понимающих SAFEARRAY: VB 5-6, все языки .Net, VBA, C++ все версии на Intel, Дельфи, MS Java (думаю, хватит).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте AndyZ, вы писали:
AZ>Спасибо всем за ответы. С массивом вариантов (VT_ARRAY |VT_I4) разобрался , все оказалось не так сложно. Вот единственное что осталось так это научиться задавать массив сразу на VB. Если вопрос не сюда, сильно не бейте. Если бы клиент был написан на VC++, проблем нет одним махом (сразу все элементы без обращения по индексу) задается вариантный массив, который превращается в SAFEARRAY. А вот в бэйсике можно задать только одномерный массив DIM A= Array (1,4,5,6,7). А как задать двумерный (многомерный)?
В VB все массивы являются SAFEARRAY-ми. ;)
А задавать так:
Dim ary(0 to 10, 1 TO 3) as Type
Где Type — это любай VB-тип.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте VladD2, вы писали:
VD>Здравствуйте AndyZ, вы писали:
AZ>>Спасибо всем за ответы. С массивом вариантов (VT_ARRAY |VT_I4) разобрался , все оказалось не так сложно. Вот единственное что осталось так это научиться задавать массив сразу на VB. Если вопрос не сюда, сильно не бейте. Если бы клиент был написан на VC++, проблем нет одним махом (сразу все элементы без обращения по индексу) задается вариантный массив, который превращается в SAFEARRAY. А вот в бэйсике можно задать только одномерный массив DIM A= Array (1,4,5,6,7). А как задать двумерный (многомерный)?
VD>В VB все массивы являются SAFEARRAY-ми. ;)
VD>А задавать так:
VD>Dim ary(0 to 10, 1 TO 3) as Type
VD>Где Type — это любай VB-тип.
Да! Чуть не забыл!!! Массивы созданные как я показал размещаются статически.
Если нужно перезанимать (расширять, уменьшать размеры) массив, лучше делать так:
Dim ary() as Type
ReDim ary(0 to 10, 1 TO 3)
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD>>А задавать так:
VD>>Dim ary(0 to 10, 1 TO 3) as Type
VD>ReDim ary(0 to 10, 1 TO 3)
Спасибо. Вот как определить, понятно. А вот как сроазу сказать массиву , что у него будут такие то элементы (т е как задать значения сразу). Например как в С — элементы двумерного задаются в фигурных скобках, а на VB как это сделать?
Здравствуйте AndyZ, вы писали:
AZ>Здравствуйте VladD2, вы писали:
VD>>>А задавать так:
VD>>>Dim ary(0 to 10, 1 TO 3) as Type
VD>>ReDim ary(0 to 10, 1 TO 3)
AZ>Спасибо. Вот как определить, понятно. А вот как сроазу сказать массиву , что у него будут такие то элементы (т е как задать значения сразу). Например как в С — элементы двумерного задаются в фигурных скобках, а на VB как это сделать?
В VB 6.0 никак. В VB.Net:
Dim ary() as Type = Type(...)
или чтото вроде того.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.