Аннотация :
В Internet-конференциях часто задаются вопросы, связанные с использованием таких типов, как VARIANT, SafeArray, BSTR и им подобных. Эти типы и API для работы с ними появились еще в 1995 году. Microsoft уже заявляет об отказе от развития COM, а количество вопросов не уменьшается.
Уже в те незапамятные годы автор воистину великого труда Hardcore Visual Basic (кто не читал, настоятельно рекомендуем, несмотря на отвратительное качество русского перевода, даже название было переведено как «Visual Basic – крепкий орешек», до 2000 года она входила в состав MSDN) написал ряд статей, посвященных этому вопросу. Но Automation API тех времен и современное – это совершенно разные вещи. Долгое время по Automation API даже не существовало человеческой документации, а многие функции просто не были документированы. К началу нового столетия Microsoft накопил денег, и посадил технических писателей за документацию Automation API. К сожалению, они слишком близко приняли к сердцу изречение А.П.Чехова «краткость – сестра таланта», и воплотили его в жизнь в этой документации чересчур буквально.
Очевидно, назрела насущная необходимость в новой версии такого материала. Свою статью я решил построить похожим образом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
По-моему, в примере к функциям 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;
Как это понимать (сабж)? А что взамен? Можно ли оцениеть в какой версии винды поддержки COM уже не будет? NT7,8,9? Например в NT5 уже практически нет поддержки Win16... (а это 95, 98, 2k. т.е. +3 версии)
Здравствуйте, SergH, Вы писали:
SH>midl говорит error MIDL2072 : inapplicable attribute : [uuid] [ Struct 'PersonStruct' ]
SH>VC 6.0 SP5
SH>В описании ключевого слова struct в MSDN про uuid тоже ничего не сказано.
SH>Что-то здесь не так.
К сожалению, я не проверял этот код на VC6. Сейчас проверил... он действительно неработает. Все дело в версии мидл-а. Если заменить мидл на аналогичный из поставки VC7, все компилируется прекрасно. Так что для VC6 нужно или заменить мидл, или ползоваться ручной ассоциацией гуида и typdef-ом при объявлении.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Tom, Вы писали:
SH>>>Что-то здесь не так. Tom>>typedef добавь
VD>Прочти что написано в статье.
Читал. И что? Я автору ответил, что что бы в 6-ке заработало нужно typedef добавить. И что не правильно?
Здравствуйте, VladD2, Вы писали:
VD>К сожалению, я не проверял этот код на VC6. Сейчас проверил... он действительно неработает. Все дело в версии мидл-а. Если заменить мидл на аналогичный из поставки VC7, все компилируется прекрасно.
Спасибо, я бы не догадался. Всё ни как не привыкну, что уже есть что-то новее VC6.
VD>На всякий, случай новый мидл можно взять здесь http://rsdn.ru/midl/Bin.zip
И правда, работает. Но лучше все же с typedef-ом, а то проект только у меня сможет скомпилиться.
Здравствуйте, rsdn_user, Вы писали:
_>Такой занимательной статьи я давно не читал! Написано содержательно и понятным языком. И даже с юмором. Такие статьи читать нескучно
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, LaFlour, Вы писали:
LF>>скучно глюки в статье править
VD>Не скучно статьи писатьт. Код пишется шустро и без напряга, а вот мысли формулировать... это не в форумах лясы точить.
Аднозначно
Я вообще ЗА чтобы были ошибки, т.к. это позволяет не просто передирать код, а хоть немного думать о том
что пишешь
Здравствуйте, LaFlour, Вы писали:
LF>Я вообще ЗА чтобы были ошибки, т.к. это позволяет не просто передирать код, а хоть немного думать о том LF>что пишешь
А... ну, это лЭгко.
... << RSDN@Home 1.1 beta 2 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.