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