SafeArray помогите!
От: Sunny_xms  
Дата: 03.07.01 09:29
Оценка:
SafeArray помогите!

народ! помогите!

надо в 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
Re: SafeArray помогите!
От: VladD2 Российская Империя www.nemerle.org
Дата: 04.07.01 21:53
Оценка:
Здравствуйте OlegO, вы писали:

OO>использование типа VARIANT просто необходимо, для того что бы

OO>люди могли нормально работать с COM из VB и VB Script.

И что даже сможете аргументировать.

Ну, если VBScript, то конечно. А из VB без вариантов и проще и удобнее.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: SafeArray помогите!
От: OlegO Россия http://www.mediachase.ru
Дата: 05.07.01 07:47
Оценка:
Здравствуйте VladD2, вы писали:

VD>И что даже сможете аргументировать.


Аргументом использования VARIANT является поддержка возможности
передавать через одну ф-ю данные разного типа. Идея тут одна — как
умеет пользователь так он и передает информацию в Объект. А ты уже
должен в Объекте обеспечить поддержку перевода информации к вид который
тебе удобен, или на худой момент сказать что тип не верен.

Что делает работу из VB как мне кажется более удобной, нет надобности
постоянно расписывать VB Developeram, что за тип надо передавать,

Наглядный пример передача числа как числа или как строки.
На своем опыте столкнулся что VB Dev. любят хранить числа в строках :).

C уважением Олег.

PS > Хотя согласен тут должна быть мера, иногда удобнее указывать тип
конкретно.
С уважением, OlegO.
Re[3]: SafeArray помогите!
От: VladD2 Российская Империя www.nemerle.org
Дата: 05.07.01 17:47
Оценка:
Здравствуйте OlegO, вы писали:

Да с аргументами все в порядке. У человека вопрос был на который ответить можно только код глянув. Я ему об этом написал, а он молчит (как рыба об лёд). :)
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: SafeArray помогите!
От: Sunny_xms  
Дата: 06.07.01 10:49
Оценка:
господа!

спсибо всем, кто отклинкулся, но я уже сам решил сложившуюся проблему...

единственное что мне действительно осталось интересно в этом вопросе, что значит (fFeatures=0x00a)?? — это что-то встроенно-зарезервированное VB?

если никто не знает — то тема, полагаю, закрыта! :)

ещё раз всем спасибо! :)
Re[5]: SafeArray помогите!
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.07.01 18:22
Оценка:
Здравствуйте 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.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: SafeArray помогите!
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.07.01 18:27
Оценка:
Здравствуйте VladD2, вы писали:

Да! На сам вопрос я так и не ответил. :)

> это что-то встроенно-зарезервированное VB?


Нет. Эти влаги описаны в MSDN. Но формат 0x8 я не знаю.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.