Поделиться через


Структура SAFEARRAY (oaidl.h)

Представляет безопасный массив.

Синтаксис

typedef struct tagSAFEARRAY {
  USHORT         cDims;
  USHORT         fFeatures;
  ULONG          cbElements;
  ULONG          cLocks;
  PVOID          pvData;
  SAFEARRAYBOUND rgsabound[1];
} SAFEARRAY;

Members

cDims

Количество измерений.

fFeatures

Флаги.

Ценность Meaning
FADF_AUTO
0x0001
Массив, выделенный в стеке.
FADF_STATIC
0x0002
Массив, статически выделенный.
FADF_EMBEDDED
0x0004
Массив, внедренный в структуру.
FADF_FIXEDSIZE
0x0010
Массив, который не может быть изменен или перераспрежден.
FADF_RECORD
0x0020
Массив, содержащий записи. При установке будет указатель на интерфейс IRecordInfo непосредственно перед дескриптором безопасного массива (при отрицательном размере смещения(IRecordInfo*)).
FADF_HAVEIID
0x0040
Массив, имеющий интерфейс идентификации IID. Если задано, перед дескриптором безопасного массива (при отрицательном смещение 16) будет использоваться GUID. Флаг задается только в том случае, если FADF_DISPATCH или FADF_UNKNOWN также задано.
FADF_HAVEVARTYPE
0x0080
Массив с типом варианта. Тип варианта можно получить с помощью SafeArrayGetVartype.
FADF_BSTR
0x0100
Массив BSTR.
FADF_UNKNOWN
0x0200
Массив IUnknown*.
FADF_DISPATCH
0x0400
Массив IDispatch*.
FADF_VARIANT
0x0800
Массив VARIANTs.
FADF_RESERVED
0xF008
Биты, зарезервированные для будущего использования.

cbElements

Размер элемента массива.

cLocks

Количество заблокированных массивов без соответствующей разблокировки.

pvData

Данные.

rgsabound[1]

Один привязан к каждому измерению.

Замечания

Массив rgsabound хранится с левым большинством измерений в rgsabound[0] и правым измерением в rgsabound[cDims - 1]. Если массив был указан в синтаксисе C-like как [2][5], он будет содержать два элемента в векторе rgsabound . Элемент 0 имеет lLbound от 0 и cElements 2. Элемент 1 имеет lLbound от 0 и cElements 5.

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

Безопасность потоков

Все общедоступные статические члены типа данных SAFEARRAY являются потокобезопасным. Элементы экземпляра не гарантированы как потокобезопасные.

Например, рассмотрим приложение, использующее функции SafeArrayLock и SafeArrayUnlock . Если эти функции вызываются одновременно из разных потоков в одном экземпляре типа данных SAFEARRAY , может быть создано несогласованное число блокировок. В конечном итоге функция SafeArrayUnlock возвращает E_UNEXPECTED. Это можно предотвратить, предоставив собственный код синхронизации.

Требования

Требование Ценность
Header oaidl.h