Здравствуйте, StandAlone, Вы писали:
SA>Здравствуйте, Аноним, Вы писали:
SA>Масса! Джимми иметь задавать глупый вопрос, масса! SA>А почему Вы не сделали (BSTR*) (Result->parray->pvData)? Ведь белым людям
не люблю сишные касты даже когда вместо reinterpret — плюсовые подсвечиваются.
SA>можно приводить все, что угодно куда угодно!?Невзирая на степень недокументированности SA>тех или иных полей структтуры — ведь m$ никогда их не меняет(там тоже белые люди)!
Можете пользоваться SafeArrayAccess(unaccess)Data. А (BSTR*) (Result->parray->pvData) пишут далеко не самые плохие програмеры в самом Майкрософте. Причина, скорее всего таковы:
а)SafeArrayAccess(unaccess)Data задуманы для синхронизированного доступа (IMHO) к данным — пока SafeArray исключительно ваш — можно обойтись
б)Когда их придумали — предпологали что SafeArray может изменится. Но потом стало очевидно, что этого никогда не случиться.
SA>1."Неважно, как быстро работает твоя программа, если она не работает."(с)
Старая истина.И в вашем коде серьзная проблема — он игнорирует возможные ошибки.
SA>2.Приведенный мною код — результат двухсуточного чтения MSDN и попыток понять, SA>что же именно и где в <стандартных> функциях для VARIANT не работает.Понял.
Могу вам в двух словах сформулировать: не стоит ожидать успешной конверсии VT_EMPTY и VT_NULL во что либо ещё. VariantChangeType вообще-то возвращает HRESULT, который вообще-то проверять положено — можно даже себе пару дней раздумий сэкономить если так и делать. Не стоит ожидать всегда успешной VariantChangeType — даже при "легальной" конверсии может и E_OUTOFMEMORY вернуть, например. И нюансов при преобразованиях хватает.
SA>Финальный вариант, оттестированный и работающий с клиентом, как надо
Понимать что код делает тяжеловато, не дай бог в таком стиле чего посложнее сделать. Говоря о потерях времени я имею в виду не SafeArrayAccess, а абсолютно ненужное создание второго SafeArray, второго VARIANT, и странные манипуляции со всем этим хозяйством. Кстати, VARIANT — обычная и документированная структура, можете делать с ней всё что хотите.
Приведенный мною код — основан на опыте прим. 5 лет почти исключительно ATL/СОМ программирования (правда давно им почти не занимаюсь), уж не знаю скольких дней с МСДН, и бесчисленного кол-ва виденных МС исходников (по части Result->parray->pvData).