Страница 19 из 111
Функции API, работающие с вариантами Эти функции позволяют приложениям работать с переменными VARIANTARG. Приложениям, реализующим IDispatch, следует проверять каждый параметр VARIANTARG на все допустимые типы, пытаясь привести вариант к каждому из типов с помощью VariantChangeType или VariantChangeTypeEx. Если в качестве параметров допустимы объекты, то приложению следует всегда выполнять проверку на объектные типы перед проверкой на все остальные типы. Если ожидается объектный тип, то приложение должно использовать IUnknown::QueryInterface, чтобы проверить, относится ли объект к надлежащему типу. Хотя приложения могут работать с VARIANTARG и без функций API, использование этих функций гарантирует, что все реализации IDispatch будут применять одинаковые правила преобразования и приведения типов. Например, эти функции при необходимости автоматически преобразуют числовые аргументы в строковые и наоборот. Так как варианты могут содержать стоки, ссылки на скаляры, объекты и массивы, необходимо соблюдать правила, определяющие владельца данных. Все работающие с вариантами функции должны соблюдать следующие правила: - Прежде чем их использовать, все VARIANTARG нужно инициализировать с по мощью Variantlnit.
- Для типов VT_UI1, VT_I2, VT_I4, VT_R4, VT_R8, VT_BOOL, VT_ERROR, VT_CY и VT_DATE данные хранятся внутри структуры VARIANT. Указатели на эти данные становятся недействительными после изменения типа варианта.
- Для типов VT_BYREF | любой_тип память, на которую ссылается вариант, при надлежит вызывающему функцию и им и освобождается.
- В случае VT_BSTR существует только один владелец строки. Все строки в вариантах должны создаваться с помощью функции SysAllocString. При освобождении или изменении типа варианта, содержащего VT_BSTR, для строки вызывается SysFreeString.
- Правила для типов VT_ARRAY | любой_тип аналогичны правилам для VT_BSTR. Все массивы в вариантах должны создаваться с помощью SafeArrayCreate. При освобождении или изменении типа варианта, в котором установлен флаг VT_ARRAY, вызывается SafeArrayDestroy.
- В случае типов VT_DISPATCH и VT_UNKNOWN объекты имеют счетчики ссылок, которые увеличиваются при помещении объектов в вариант. При освобождении варианта или изменении его типа для объекта, на который он ссылается, вызывается Release.
|