size_is для размерности LONG lLbound;
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++ выглядел бы примерно так:
Содержание Назад Вперед