Сущность технологии COM



         

Массивы - часть 13


typedef struct tagSAFEARRAYBOUND { ULONG cElements; // size_is for dimension // size_is для размерности LONG lLbound; // min index for dimension (usually 0) // минимальный индекс для размерности (обычно 0) } SAFEARRAYBOUND;

Тип данных SAFEARRAY внутри использует совместимый массив типа SAFEARRAYBOUND, чтобы придать некоторую форму содержимому массива:

typedef struct tagSAFEARRAY { USHORT cDims; // # of dimensions // число измерений USHORT fFeatures; // flags describing contents // флаги, описывающие содержимое ULONG cbElements; // # of bytes per element // число байтов на элемент ULONG cLocks; // used to track memory usage // применяется для слежения за использованием памяти void* pvData; // actual elements // фактические элементы [size_is(cDims)] SAFEARRAYBOUND rgsabound[] } SAFEARRAY;

Приведенный выше IDL в действительности не используется для описания сетевого формата массивов SAFEARRAY, однако он используется для их программного описания.

Чтобы обеспечить пользователю максимальную гибкость в вопросах управления памятью, в СОМ определены следующие флаги, которые могут использоваться с полем fFeatures:

FADF_AUTO /* array is allocated on the stack */ /* массив размещен в стеке */

FADF_STATIC /* array is statically allocated */ /* массив размещен статически */

FADF_EMBEDDEO /* array is embedded in a structure */ /* массив вложен в структуру */

FADF_FIXEDSIZE /* may not be resized or reallocated */ /* не может изменить размеры или быть перемещен*/

FADF_BSTR /* an array of BSTRs */ /* массив из BSTR */

FADF_UNKNOWN /* an array of IUnknown* */ /* массив из IUnknown* */

FADF_DISPATCH /* an array of IDispatch* */ /* массив из IDispatch* */

FADF_VARIANT /* an array of VARIANTS */ /* массив из VARIANTS */

Для предоставления SAFEARRAY возможности определять типы данных своих элементов, компилятор IDL распознает специальный, специфический для SAFEARRAY, синтаксис:

HRESULT Method([in] SAFEARRAY(type) *ppsa);

где type — тип элемента в SAFEARRAY. Соответствующий прототип данного метода в C++ выглядел бы примерно так:




Содержание  Назад  Вперед