Страница 91 из 111 Тип данных 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 // Биты зарезервированы на будущее |