Шаг 92 - Тип данных 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 описывают атрибуты массива, которые могут повлиять на то, как освобождается массив. Это позволяет освобождать массив, не обращаясь к содержащему его варианту. Для доступа к битам флагов используются следующие константы:

#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  		// Биты зарезервированы на будущее.

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 16.03.2003