VARIANT и SafeArray
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.10.02 10:56
Оценка: 445 (11) +1
Статья :
VARIANT и SafeArray
Автор(ы):
Дата: 13.10.2002


Авторы :
VladD2

Аннотация :
В Internet-конференциях часто задаются вопросы, связанные с использованием таких типов, как VARIANT, SafeArray, BSTR и им подобных. Эти типы и API для работы с ними появились еще в 1995 году. Microsoft уже заявляет об отказе от развития COM, а количество вопросов не уменьшается.

Уже в те незапамятные годы автор воистину великого труда Hardcore Visual Basic (кто не читал, настоятельно рекомендуем, несмотря на отвратительное качество русского перевода, даже название было переведено как «Visual Basic – крепкий орешек», до 2000 года она входила в состав MSDN) написал ряд статей, посвященных этому вопросу. Но Automation API тех времен и современное – это совершенно разные вещи. Долгое время по Automation API даже не существовало человеческой документации, а многие функции просто не были документированы. К началу нового столетия Microsoft накопил денег, и посадил технических писателей за документацию Automation API. К сожалению, они слишком близко приняли к сердцу изречение А.П.Чехова «краткость – сестра таланта», и воплотили его в жизнь в этой документации чересчур буквально.

Очевидно, назрела насущная необходимость в новой версии такого материала. Свою статью я решил построить похожим образом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: VARIANT и SafeArray
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.07.03 21:19
Оценка: 16 (1)
Здравствуйте, SergH, Вы писали:

SH>midl говорит error MIDL2072 : inapplicable attribute : [uuid] [ Struct 'PersonStruct' ]


SH>VC 6.0 SP5


SH>В описании ключевого слова struct в MSDN про uuid тоже ничего не сказано.


SH>Что-то здесь не так.


К сожалению, я не проверял этот код на VC6. Сейчас проверил... он действительно неработает. Все дело в версии мидл-а. Если заменить мидл на аналогичный из поставки VC7, все компилируется прекрасно. Так что для VC6 нужно или заменить мидл, или ползоваться ручной ассоциацией гуида и typdef-ом при объявлении.

На всякий, случай новый мидл можно взять здесь http://rsdn.ru/midl/Bin.zip
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Сила !!! Даешь статью про скриптинг ?
От: Аноним  
Дата: 14.10.02 10:56
Оценка: 1 (1)
А много подводных камней валяется на этом пути...
Microsoft уже заявляет об отказе от развития COM
От: SVV Беларусь  
Дата: 15.10.02 10:14
Оценка:
Как это понимать (сабж)? А что взамен? Можно ли оцениеть в какой версии винды поддержки COM уже не будет? NT7,8,9? Например в NT5 уже практически нет поддержки Win16... (а это 95, 98, 2k. т.е. +3 версии)
Ошибка в примере?
От: Алексей Владимирович Миронов Россия  
Дата: 18.10.02 13:48
Оценка:
По-моему, в примере к функциям SafeArrayGetElement(), SafeArrayPutElement() ошибка.

for (i = 0; i <= iUBound — iLBound; i++) // судя по всему, i — целочисленная переменная
{
hr = SafeArrayGetElement(psaiInOut, i, &iVal);
// В этом месте компилятор ругается: error C2664: 'SafeArrayGetElement' : cannot convert
// parameter 2 from 'long' to 'long *'

if(FAILED(hr))
return hr;

iVal++;

hr = SafeArrayPutElement(psaiInOut, i, &iVal); // в этом тоже ругается

if(FAILED(hr))
return hr;
}

Необходимо завести массив long indexes[] и затем применять его, например, следующим образом:

for (i = 0, indexes[0] = iLBound; i <= iUBound — iLBound; i++, indexes[0]++)
{
hr = SafeArrayGetElement(psaiInOut, indexes, &iVal);
if(FAILED(hr))
return hr;

iVal++; // Увеличиваем значение ячейки массива.

hr = SafeArrayPutElement(psaiInOut, indexes, &iVal);
if(FAILED(hr))
return hr;
}
Re: Ошибка в примере?
От: Vi2 Удмуртия http://www.adem.ru
Дата: 22.10.02 05:42
Оценка:
Зачем новый массив? Достаточно работы и с индексом i, только по-другому.
for (i = iLBound; i <= iUBound; i++ ) 
{
  hr = SafeArrayGetElement(psaiInOut, &i, &iVal);
  if(FAILED(hr))
    return hr;

  iVal++; // Увеличиваем значение ячейки массива.

  hr = SafeArrayPutElement(psaiInOut, &i, &iVal);  
  if(FAILED(hr))
    return hr;
}
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
.NET, конечно
От: retalik www.airbandits.com/
Дата: 01.11.02 06:27
Оценка:
Кстати, NT5==w2k.
А win16 нет в живых уже 7 лет
Успехов,
Виталий.
Re: .NET, конечно
От: dad  
Дата: 17.12.02 15:15
Оценка:
а сколько осталось жить .Net ?
Веру-ю-у! В авиацию, в научную революци-ю-у, в механизацию сельского хозяйства, в космос и невесомость! Веру-ю-у! Ибо это объективно-о! (Шукшин)
Re: .NET, конечно
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.06.03 21:29
Оценка:
Здравствуйте, retalik, Вы писали:

R>Кстати, NT5==w2k.

R>А win16 нет в живых уже 7 лет

И тем не менее моя 16-и битная бухгалтерия и по ныде (уже под ХаРэ) прекрасно работат. Так что нет развития, а поддержка есть.
... << RSDN@Home 1.1 alpha 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: VARIANT и SafeArray
От: SergH Россия  
Дата: 08.07.03 11:09
Оценка:
Здравствуйте, VladD2, Вы писали статью.

На

    [uuid(AF4361C3-2733-487a-90B4-689AC6A180B5)] struct PersonStruct
    {
        BSTR name;
        long identifier;
    };


midl говорит error MIDL2072 : inapplicable attribute : [uuid] [ Struct 'PersonStruct' ]

VC 6.0 SP5

В описании ключевого слова struct в MSDN про uuid тоже ничего не сказано.

Что-то здесь не так.
Делай что должно, и будь что будет
Re[2]: VARIANT и SafeArray
От: Tom Россия http://www.RSDN.ru
Дата: 08.07.03 11:21
Оценка:
SH>Что-то здесь не так.
typedef добавь
... << RSDN@Home 1.1 beta 1 >>
Народная мудрось
всем все никому ничего(с).
Re[3]: VARIANT и SafeArray
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.07.03 21:20
Оценка:
Здравствуйте, Tom, Вы писали:

SH>>Что-то здесь не так.

Tom>typedef добавь

Прочти что написано в статье.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: VARIANT и SafeArray
От: Tom Россия http://www.RSDN.ru
Дата: 09.07.03 07:51
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, Tom, Вы писали:


SH>>>Что-то здесь не так.

Tom>>typedef добавь

VD>Прочти что написано в статье.

Читал. И что? Я автору ответил, что что бы в 6-ке заработало нужно typedef добавить. И что не правильно?
... << RSDN@Home 1.1 beta 1 >>
Народная мудрось
всем все никому ничего(с).
Re[5]: VARIANT и SafeArray
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.07.03 19:29
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Читал. И что? Я автору ответил, что что бы в 6-ке заработало нужно typedef добавить. И что не правильно?


Да то что в статье как раз рассказывается про баг midl-а который таким образом обходится.

А исправить можно просто заменой мидла. Сам VC ничего не делает.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: VARIANT и SafeArray
От: SergH Россия  
Дата: 10.07.03 01:10
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>К сожалению, я не проверял этот код на VC6. Сейчас проверил... он действительно неработает. Все дело в версии мидл-а. Если заменить мидл на аналогичный из поставки VC7, все компилируется прекрасно.


Спасибо, я бы не догадался. Всё ни как не привыкну, что уже есть что-то новее VC6.

VD>На всякий, случай новый мидл можно взять здесь http://rsdn.ru/midl/Bin.zip


И правда, работает. Но лучше все же с typedef-ом, а то проект только у меня сможет скомпилиться.
Делай что должно, и будь что будет
Re: Руль!
От: rsdn_user  
Дата: 25.09.03 13:48
Оценка:
Такой занимательной статьи я давно не читал! Написано содержательно и понятным языком. И даже с юмором. Такие статьи читать нескучно
Re[2]: Руль!
От: LaFlour Австралия blog: http://spaces.live.com/laflour
Дата: 25.09.03 15:03
Оценка:
Здравствуйте, rsdn_user, Вы писали:

_>Такой занимательной статьи я давно не читал! Написано содержательно и понятным языком. И даже с юмором. Такие статьи читать нескучно


скучно глюки в статье править
Re[3]: Руль!
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.09.03 15:31
Оценка:
Здравствуйте, LaFlour, Вы писали:

LF>скучно глюки в статье править


Не скучно статьи писатьт. Код пишется шустро и без напряга, а вот мысли формулировать... это не в форумах лясы точить.
... << RSDN@Home 1.1 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Руль!
От: LaFlour Австралия blog: http://spaces.live.com/laflour
Дата: 29.09.03 08:11
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, LaFlour, Вы писали:


LF>>скучно глюки в статье править


VD>Не скучно статьи писатьт. Код пишется шустро и без напряга, а вот мысли формулировать... это не в форумах лясы точить.

Аднозначно

Я вообще ЗА чтобы были ошибки, т.к. это позволяет не просто передирать код, а хоть немного думать о том
что пишешь

"... ПИСТОЛЕТ — столетний юбилей числа "ПИ"."

Re[5]: Руль!
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.09.03 11:04
Оценка:
Здравствуйте, LaFlour, Вы писали:

LF>Я вообще ЗА чтобы были ошибки, т.к. это позволяет не просто передирать код, а хоть немного думать о том

LF>что пишешь

А... ну, это лЭгко.
... << RSDN@Home 1.1 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: VARIANT и SafeArray
От: Rumata Россия http://atamur.livejournal.com
Дата: 10.03.05 21:49
Оценка:
Здравствуйте, VladD2, Вы писали:

При попытке использования кода, выползла маленькая ошибочка для кода
psa->rgsabound.cElements

т.к. SAFEARRAY Объявлен, как
typedef struct tagSAFEARRAY
    {
    USHORT cDims;
    USHORT fFeatures;
    ULONG cbElements;
    ULONG cLocks;
    PVOID pvData;
    SAFEARRAYBOUND rgsabound[ 1 ];
    }     SAFEARRAY;

есстественно, код не работает, надо делать так:
psa->rgsabound[0].cElements;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.