Страница 20 из 111
VariantChangeType Преобразует вариант из одного типа в другой. HRESULT VariantChangeType ( VARIANTARG FAR* pvargDest, VARIANTARG FAR* pvarSrc, unsigned short wFlags, VARTYPE vt );
Параметры: pvargDest Указатель на VARIANTARG, принимающий результаты приведения типа. Если это тот же указатель, что и pvarSrc, то вариант преобразуется по месту. pvarSrc Указатель на исходный VARIANTARG, который нужно привести к новому типу. wFlags Флаги, управляющие преобразованием. В настоящий момент определен единственный флаг — VARIANT_NOVALUEPROP, который запрещает функции пытаться преобразовывать объект к базовому типу данных, обращаясь к свойству Value. Приложениям следует устанавливать этот флаг только при необходимости, так как после этого их поведение будет отличаться от поведения других приложений. vt Целевой тип преобразования. Если функция возвращает код S_OK, то поле vt в *pvargDest всегда равно данному значению. Коды возврата: Из возвращенного HRESULT получают один из следующих кодов возврата: Код возврата | Значение | S_OK | Успех. | DISP_E_BADVARTYPE | vt - недопустимый тип варианта. | DISP_E_OVERFLOW | Значение, на которое указывает pvarSrc, не умещается в диапазон целевого типа. | DISP_E_TYPEMISMATCH | Аргумент нельзя привести к заданному типу. | E_INVALIDARG | Один из аргументов неверен. | E_OUTOFMEMORY | He хватает памяти для преобразования. | Комментарии: Функция VariantChangeType() выполняет преобразование между базовыми типами (включая преобразования из числа в строку и из строки в число). Вариант, в котором установлен флаг VT_BYREF, преобразуется к значению путем получения значения, на которое он ссылается. Объект приводится к значению путем обращения к свойству Value (DISPID_VALUE). Обычно реализация IDispatch::Invoke определяет, к какому члену выполняется обращение, и затем вызывает VariantChangeType, чтобы получить значение одного или нескольких аргументов. Например, если вызов IDispatch задает член SetTitle, который принимает один строковый аргумент, то реализация вызывает VariantChangeType, пытаясь преобразовать параметр в строку. Если VariantChangeType не возвращает ошибку, то значение аргумента можно считать непосредственно из поля bstrVal структуры VARIANTARG. Если VariantChangeType возвращает DISP_E_TYPEMISMATCH, то реализация должна установить *puArgErr в 0 (указывая аргумент, вызвавший ошибку) и возвратить из IDispatch::Invoke DISP_E_TYPEMISMATCH. Данная функция не преобразует массив одного типа в массив другого типа. Примечание. Тип VARIANTARG не следует преобразовывать «по месту» в массиве rgvarg. |