Справочник по технологии COM
Страница 91. Тип данных SAFEARRAY


 

Тип данных SAFEARRAY

Определение безопасного массива зависит от ОС. В 32-разрядной Windows поля cbElements и cLocks — это целые типа unsigned long, а поле handle отсутствует. В 16-разрядной Windows поля cbElements и cLocks — это целые типа unsigned short. Поле handle сохранено для совместимости со старым ПО. Например:

typedef Struct FARSTRUCT tagSAFEARRAY 
{
unsigned short cDims;// Число измерений массива.
unsigned short fFeatures;// Флаги, используемые функциями SafeArray,
// описаны ниже.
#if defined(WIN32)
unsigned long cbElements;// Размер элемента массива.
// He учитывает размер указываемых данных.
unsigned long cLocks;// Текущее число блокировок массива.
#else
unsigned short cbElements;
unsigned short cLocks;
unsigned long handle;// He используется, но оставлено для
// совместимости.
#endif
void HUGEP* pvData;// Указатель на данные.
SAFEARRAYBOUND rgsabound[1];// По одному описанию границ на каждое
// измерение.
} SAFEARRAY;

В rgsabound[0] хранится информация о самом левом измерении, а в rgsabound[cDims-1 ] — о самом правом. Для массива, который с использованием синтаксиса С задается как [2][5], в векторе rgsabound хранилось бы два элемента. Элемент 0 содержал бы 1Lbound, равное 0, и cElements, равное 2. Элемент 1 содержал бы 1Lbound, равное 0, и cElements, равное 5.

Флаги fFeatures описывают атрибуты массива, которые могут повлиять на то, как освобождается массив. Это позволяет освобождать массив, не обращаясь к содержащему его варианту. Для доступа к битам флагов используются следующие константы:

#defineFADF_AUTO0x0001// Массив размещен на стеке,
#defineFADF_STATIC0x0002// Массив размещен статически.
#defineFADF_EMBEDDED0x0004// Массив находится внутри структуры.
#defineFADF_FIXEDSIZE0x0010// Размер массива нельзя изменять,
// и массив не может перемещаться.
#defineFADF_BSTR0x0100// Массив BSTR.
#defineFADF_UNKNOWN0x0200// Массив IUnknown*.
#define FADF_DISPATCH 0x0400 // Массив IDispatch*.
#define FADF_VARIANT 0x0800 // Массив VARIANT.
#define FADF_RESERVED 0xF0E8 // Биты зарезервированы на будущее

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