Справочник по технологии COM
Страница 19. Функции API, работающие с вариантами


Функции API, работающие с вариантами

Эти функции позволяют приложениям работать с переменными VARIANTARG. Приложениям, реализующим IDispatch, следует проверять каждый параметр VARIANTARG на все допустимые типы, пытаясь привести вариант к каждому из типов с помощью VariantChangeType или VariantChangeTypeEx. Если в качестве параметров допустимы объекты, то приложению следует всегда выполнять проверку на объектные типы перед проверкой на все остальные типы. Если ожидается объектный тип, то приложение должно использовать IUnknown::QueryInterface, чтобы проверить, относится ли объект к надлежащему типу.

Хотя приложения могут работать с VARIANTARG и без функций API, использование этих функций гарантирует, что все реализации IDispatch будут применять одинаковые правила преобразования и приведения типов. Например, эти функции при необходимости автоматически преобразуют числовые аргументы в строковые и наоборот.

Так как варианты могут содержать стоки, ссылки на скаляры, объекты и массивы, необходимо соблюдать правила, определяющие владельца данных. Все работающие с вариантами функции должны соблюдать следующие правила:

  1. Прежде чем их использовать, все VARIANTARG нужно инициализировать с по мощью Variantlnit.
  2. Для типов VT_UI1, VT_I2, VT_I4, VT_R4, VT_R8, VT_BOOL, VT_ERROR, VT_CY и VT_DATE данные хранятся внутри структуры VARIANT. Указатели на эти данные становятся недействительными после изменения типа варианта.
  3. Для типов VT_BYREF | любой_тип память, на которую ссылается вариант, при надлежит вызывающему функцию и им и освобождается.
  4. В случае VT_BSTR существует только один владелец строки. Все строки в вариантах должны создаваться с помощью функции SysAllocString. При освобождении или изменении типа варианта, содержащего VT_BSTR, для строки вызывается SysFreeString.
  5. Правила для типов VT_ARRAY | любой_тип аналогичны правилам для VT_BSTR. Все массивы в вариантах должны создаваться с помощью SafeArrayCreate. При освобождении или изменении типа варианта, в котором установлен флаг VT_ARRAY, вызывается SafeArrayDestroy.
  6. В случае типов VT_DISPATCH и VT_UNKNOWN объекты имеют счетчики ссылок, которые увеличиваются при помещении объектов в вариант. При освобождении варианта или изменении его типа для объекта, на который он ссылается, вызывается Release.

 

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