Справочник по технологии COM
Страница 21. VariantChangeTypeEx


 

VariantChangeTypeEx

Преобразует вариант из одного типа в другой с учетом LCID.

HRESULT VariantChangeTypeEx
(
VARIANTARG VAR* pvargDetf,
VARIANTARG FAR* pvarSrc,
LCID kid,
unsigned short wFlags,
VARTYPE vt
);

Параметры:

  • pvargDest - Указатель на VARIANTARG, принимающий результаты приведения типа. Если это тот же указатель, что и pvarSrc, то вариант преобразуется по месту.
  • pvarSrc - Указатель на исходный VARIANTARG, который нужно привести к новому типу.
  • kid - LCID варианта, тип которого следует преобразовать. LCID полезен в том случае, когда исходный или целевой тип — это VT_BSTR, VT_DISPATCH или VT_DATE.
  • 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 хватает памяти для преобразования.

Комментарии:
Функция 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.

 
Следующая статья »