Определение безопасного массива зависит от ОС. В 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 описывают атрибуты массива, которые могут повлиять на то, как освобождается массив. Это позволяет освобождать массив, не обращаясь к содержащему его варианту. Для доступа к битам флагов используются следующие константы:
#define FADF_AUTO 0x0001 // Массив размещен на стеке, #define FADF_STATIC 0x0002 // Массив размещен статически. #define FADF_EMBEDDED 0x0004 // Массив находится внутри структуры. #define FADF_FIXEDSIZE 0x0010 // Размер массива нельзя изменять, // и массив не может перемещаться. #define FADF_BSTR 0x0100 // Массив BSTR. #define FADF_UNKNOWN 0x0200 // Массив IUnknown*. #define FADF_DISPATCH 0x0400 // Массив IDispatch*. #define FADF_VARIANT 0x0800 // Массив VARIANT. #define FADF_RESERVED 0xF0E8 // Биты зарезервированы на будущее.