надо в safearray положить VARIANT! (обычные типы всё ок!)
есть COM объект у которого есть метод [id(5), helpstring("method SetArrayValue")] HRESULT SetArrayValue([in] VARIANT Value, [in] VARIANT Args, [in, out] VARIANT *RetVal); ( В IDL так описан...)
Value — значение
Args — куда (индексы по измереням)
RetVal — сам массив (ТОЧНЕЕ: VARIANT В КОТОРОМ ПО PARRAY ЛЕЖИТ МАССИВ!)
фишка в следующем: на возврате из метода происходит исключение Invalid procedure call or argument или Method .... of ..... Failed...
причём что самое ваще странное: у safearray есть поле fFeatures, которое указывает что и как лежит в массиве... так вот значение, которое я там вижу в отладчике — отсутствует в msdn-е! — тобишь получчается, что так не бывает! хм... (fFeatures=0x00a)
помогите, плз...
и ещё.. присылайте свои ответы, плз на _alexi_@rambler.ru
Здравствуйте OlegO, вы писали:
OO>использование типа VARIANT просто необходимо, для того что бы OO>люди могли нормально работать с COM из VB и VB Script.
И что даже сможете аргументировать.
Ну, если VBScript, то конечно. А из VB без вариантов и проще и удобнее.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте VladD2, вы писали:
VD>И что даже сможете аргументировать.
Аргументом использования VARIANT является поддержка возможности
передавать через одну ф-ю данные разного типа. Идея тут одна — как
умеет пользователь так он и передает информацию в Объект. А ты уже
должен в Объекте обеспечить поддержку перевода информации к вид который
тебе удобен, или на худой момент сказать что тип не верен.
Что делает работу из VB как мне кажется более удобной, нет надобности
постоянно расписывать VB Developeram, что за тип надо передавать,
Наглядный пример передача числа как числа или как строки.
На своем опыте столкнулся что VB Dev. любят хранить числа в строках :).
C уважением Олег.
PS > Хотя согласен тут должна быть мера, иногда удобнее указывать тип
конкретно.
Да с аргументами все в порядке. У человека вопрос был на который ответить можно только код глянув. Я ему об этом написал, а он молчит (как рыба об лёд). :)
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте Sunny_xms, вы писали:
SX>единственное что мне действительно осталось интересно в этом вопросе, что значит (fFeatures=0x00a)?? — это что-то встроенно-зарезервированное VB?
0x00a == 0x8 | 0x2
0x2 — означает, что массив расположен в стеке. Это значит что его нельзя редимнуть.
В VB этого можно добиться если написать так:
Dim ary(0 to 10) as SomeType
Т.е. задать размер массива при его описании.
0x8 — это грязь VB которая обычно появляется когда в массив кладутся нестандартные типы. Например, структуры.
И 0x2 и 0x8 приводит к проблемам и геморрою, если попытаться передать такой массив во внешнюю функции. 0x2 также не дает возможности ни изменить размер массива, ни освободить память, занятую под массив (например, для того чтобы занять больший по величине).
Теперь как избежать.
1. Если вы пользуетесь VB, объявляйте массив всегда так:
Dim ary() as SomeType
...
ReDim ary(0 to 10)
2.
Если вам необходимо передавать во внешние функции массивы нестандартных типов данных (например, структур – Type), то объявляйте такие массивы в Public-модулях. Public-модули порождают генерацию TypeLib-ов. В TypeLib помещаются описания всех необходимых типов. Это дает вам возможность нормально работать со структурами через стандартные методы SAFEARRAY-я и IRecodInfo.
Есть и еще один вариант. Необходимые типы можно описывать в IDL-е и импортировать в VB как tlb.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.