Класс CComSafeArray
Этот класс представляет собой оболочку для SAFEARRAY
структуры.
Синтаксис
template <typename T, VARTYPE _vartype = _ATL_AutomationType<T>::type>
class CComSafeArray
Параметры
T
Тип данных для сохранения в массиве.
Участники
Открытые конструкторы
Имя | Описание |
---|---|
CComSafeArray::CComSafeArray |
Конструктор. |
CComSafeArray::~CComSafeArray |
Деструктор |
Открытые методы
Имя | Описание |
---|---|
CComSafeArray::Add |
Добавляет в объект CComSafeArray один или несколько элементов или SAFEARRAY структуру. |
CComSafeArray::Attach |
Присоединяет структуру SAFEARRAY к объекту CComSafeArray . |
CComSafeArray::CopyFrom |
Копирует содержимое SAFEARRAY структуры в CComSafeArray объект. |
CComSafeArray::CopyTo |
Создает копию объекта CComSafeArray . |
CComSafeArray::Create |
Создает объект CComSafeArray . |
CComSafeArray::Destroy |
Уничтожает объект CComSafeArray . |
CComSafeArray::Detach |
Отсоединяет SAFEARRAY объект от CComSafeArray объекта. |
CComSafeArray::GetAt |
Получает один элемент из одномерного массива. |
CComSafeArray::GetCount |
Возвращает число элементов в массиве. |
CComSafeArray::GetDimensions |
Возвращает число измерений в массиве. |
CComSafeArray::GetLowerBound |
Возвращает нижнюю границу заданного измерения массива. |
CComSafeArray::GetSafeArrayPtr |
Возвращает адрес элемента данных m_psa . |
CComSafeArray::GetType |
Возвращает тип данных, хранящихся в массиве. |
CComSafeArray::GetUpperBound |
Возвращает верхнюю границу любого измерения массива. |
CComSafeArray::IsSizable |
Проверяет, можно ли изменить размер объекта CComSafeArray . |
CComSafeArray::MultiDimGetAt |
Получает один элемент из многомерного массива. |
CComSafeArray::MultiDimSetAt |
Задает значение элемента в многомерном массиве. |
CComSafeArray::Resize |
Изменяет размер объекта CComSafeArray . |
CComSafeArray::SetAt |
Задает значение элемента в одномерном массиве. |
Открытые операторы
Имя | Описание |
---|---|
CComSafeArray::operator LPSAFEARRAY |
Приведение значения к указателю SAFEARRAY . |
CComSafeArray::operator[] |
Получает элемент из массива. |
CComSafeArray::operator = |
Оператор присвоения. |
Открытые члены данных
Имя | Описание |
---|---|
CComSafeArray::m_psa |
Этот член данных содержит адрес SAFEARRAY структуры. |
Замечания
CComSafeArray
предоставляет оболочку для SAFEARRAY
класса типов данных, что упрощает создание и управление одномерными массивами практически любого из поддерживаемых VARIANT
типов.
CComSafeArray
упрощает передачу массивов между процессами и обеспечивает дополнительную безопасность путем проверки значений индекса массива на соответствие верхней и нижней границам.
Нижняя граница CComSafeArray
может начинаться с любого определенного пользователем значения. Однако нижняя граница массивов, доступ к которым осуществляется через C++, должна быть равна 0. В других языках, например Visual Basic, могут использоваться другие ограничивающие значения (например, от −10 до 10).
Используется CComSafeArray::Create
для создания CComSafeArray
объекта и CComSafeArray::Destroy
его удаления.
Может CComSafeArray
содержать следующее подмножество VARIANT
типов данных:
VARTYPE |
Description |
---|---|
VT_I1 |
char |
VT_I2 |
short |
VT_I4 |
int |
VT_I4 |
long |
VT_I8 |
longlong |
VT_UI1 |
byte |
VT_UI2 |
ushort |
VT_UI4 |
uint |
VT_UI4 |
ulong |
VT_UI8 |
ulonglong |
VT_R4 |
float |
VT_R8 |
double |
VT_DECIMAL |
указатель типа decimal |
VT_VARIANT |
указатель типа variant |
VT_CY |
Currency - тип данных |
Требования
Заголовок: atlsafe.h
Пример
// Create a multidimensional array,
// then write and read elements
// Define an array of character pointers
CComSafeArray<char> *pSar;
char cElement;
char cTable[2][3] = {'A','B','C','D','E','F'};
// Declare the variable used to store the
// array indexes
LONG aIndex[2];
// Define the array bound structure
CComSafeArrayBound bound[2];
bound[0].SetCount(2);
bound[0].SetLowerBound(0);
bound[1].SetCount(3);
bound[1].SetLowerBound(0);
// Create a new 2 dimensional array
// each dimension size is 3
pSar = new CComSafeArray<char>(bound,2);
// Use MultiDimSetAt to store characters in the array
for (int x = 0; x < 2; x++)
{
for (int y = 0; y < 3; y++)
{
aIndex[0] = x;
aIndex[1] = y;
HRESULT hr = pSar->MultiDimSetAt(aIndex,cTable[x][y]);
ATLASSERT(hr == S_OK);
}
}
// Use MultiDimGetAt to retrieve characters in the array
for (int x = 0; x < 2; x++)
{
for (int y = 0; y < 3; y++)
{
aIndex[0]=x;
aIndex[1]=y;
HRESULT hr = pSar->MultiDimGetAt(aIndex,cElement);
ATLASSERT(hr == S_OK);
ATLASSERT(cElement == cTable[x][y]);
}
}
CComSafeArray::Add
Добавляет в объект CComSafeArray
один или несколько элементов или SAFEARRAY
структуру.
HRESULT Add(const SAFEARRAY* psaSrc);
HRESULT Add(ULONG ulCount, const T* pT, BOOL bCopy = TRUE);
HRESULT Add(const T& t, BOOL bCopy = TRUE);
Параметры
psaSrc
Указатель на объект SAFEARRAY
.
ulCount
Количество объектов, добавляемых в массив.
pT
Указатель на один или несколько объектов, добавляемых в массив.
t
Ссылка на объект, добавляемый в массив.
bCopy
Указывает, следует ли создать копию данных. Значение по умолчанию — TRUE
.
Возвращаемое значение
Возвращает успешность S_OK
или ошибку HRESULT
при сбое.
Замечания
Новые объекты добавляются в конец существующего SAFEARRAY
объекта. Добавление объекта в многомерный SAFEARRAY
объект не поддерживается. При добавлении существующего массива объектов оба массива должны содержать элементы одного типа.
Флаг bCopy
учитывается, когда элементы типа BSTR
или VARIANT
добавляются в массив. Значение TRUE
по умолчанию гарантирует, что новая копия создается из данных при добавлении элемента в массив.
CComSafeArray::Attach
Присоединяет структуру SAFEARRAY
к объекту CComSafeArray
.
HRESULT Attach(const SAFEARRAY* psaSrc);
Параметры
psaSrc
Указатель на структуру SAFEARRAY
.
Возвращаемое значение
Возвращает успешность S_OK
или ошибку HRESULT
при сбое.
Замечания
Присоединяет структуру к объекту SAFEARRAY
CComSafeArray
, делая существующие CComSafeArray
методы доступными.
CComSafeArray::CComSafeArray
Конструктор.
CComSafeArray();
CComSafeArray(const SAFEARRAYBOUND& bound);
CComSafeArray(ULONG ulCount, LONG lLBound = 0);
CComSafeArray(const SAFEARRAYBOUND* pBound, UINT uDims = 1);
CComSafeArray(const CComSafeArray& saSrc);
CComSafeArray(const SAFEARRAY& saSrc);
CComSafeArray(const SAFEARRAY* psaSrc);
Параметры
bound
Структура SAFEARRAYBOUND
.
ulCount
Количество элементов в массиве.
lLBound
Нижнее ограничивающее значение; то есть индекс первого элемента в массиве.
pBound
Указатель на структуру SAFEARRAYBOUND
.
uDims
Количество измерений в массиве.
saSrc
Ссылка на структуру SAFEARRAY
или CComSafeArray
объект. В любом случае конструктор использует эту ссылку для создания копии массива, поэтому массив не ссылается после построения.
psaSrc
Указатель на структуру SAFEARRAY
. Конструктор использует этот адрес для создания копии массива, поэтому массив никогда не ссылается после построения.
Замечания
Создает объект CComSafeArray
.
CComSafeArray::~CComSafeArray
Деструктор
~CComSafeArray() throw()
Замечания
Освобождает все выделенные ресурсы.
CComSafeArray::CopyFrom
Копирует содержимое SAFEARRAY
структуры в CComSafeArray
объект.
HRESULT CopyFrom(LPSAFEARRAY* ppArray);
Параметры
ppArray
Указатель на SAFEARRAY
копию.
Возвращаемое значение
Возвращает успешность S_OK
или ошибку HRESULT
при сбое.
Замечания
Этот метод копирует содержимое объекта SAFEARRAY
в текущий CComSafeArray
объект. Существующее содержимое массива заменяется.
CComSafeArray::CopyTo
Создает копию объекта CComSafeArray
.
HRESULT CopyTo(LPSAFEARRAY* ppArray);
Параметры
ppArray
Указатель на расположение, в котором создается новая SAFEARRAY
.
Возвращаемое значение
Возвращает успешность S_OK
или ошибку HRESULT
при сбое.
Замечания
Этот метод копирует содержимое CComSafeArray
объекта в структуру SAFEARRAY
.
CComSafeArray::Create
Создает объект CComSafeArray
.
HRESULT Create(const SAFEARRAYBOUND* pBound, UINT uDims = 1);
HRESULT Create(ULONG ulCount = 0, LONG lLBound = 0);
Параметры
pBound
Указатель на объект SAFEARRAYBOUND
.
uDims
Количество измерений в массиве.
ulCount
Количество элементов в массиве.
lLBound
Нижнее ограничивающее значение; то есть индекс первого элемента в массиве.
Возвращаемое значение
Возвращает успешность S_OK
или ошибку HRESULT
при сбое.
Замечания
CComSafeArray
Объект можно создать из существующей SAFEARRAYBOUND
структуры и количества измерений или указать количество элементов в массиве и нижней границе. Если к массиву требуется получить доступ из C++, нижняя граница должна быть 0. Другие языки могут разрешать другие значения нижней границы (например, Visual Basic поддерживает массивы с элементами с диапазоном, например –10–10).
CComSafeArray::Destroy
Уничтожает объект CComSafeArray
.
HRESULT Destroy();
Возвращаемое значение
Возвращает успешность S_OK
или ошибку HRESULT
при сбое.
Замечания
Уничтожает существующий CComSafeArray
объект и все содержащиеся в нем данные.
CComSafeArray::Detach
Отсоединяет SAFEARRAY
объект от CComSafeArray
объекта.
LPSAFEARRAY Detach();
Возвращаемое значение
Возвращает указатель на SAFEARRAY
объект.
Замечания
Этот метод отсоединяет SAFEARRAY
объект от CComSafeArray
объекта.
CComSafeArray::GetAt
Получает один элемент из одномерного массива.
T& GetAt(LONG lIndex) const;
Параметры
lIndex
Номер индекса возвращаемого значения в массиве.
Возвращаемое значение
Возвращает ссылку на обязательный элемент массива.
CComSafeArray::GetCount
Возвращает число элементов в массиве.
ULONG GetCount(UINT uDim = 0) const;
Параметры
uDim
Измерение массива.
Возвращаемое значение
Возвращает число элементов в массиве.
Замечания
При использовании с многомерным массивом этот метод возвращает только количество элементов в определенном измерении.
CComSafeArray::GetDimensions
Возвращает число измерений в массиве.
UINT GetDimensions() const;
Возвращаемое значение
Возвращает число измерений в массиве.
CComSafeArray::GetLowerBound
Возвращает нижнюю границу заданного измерения массива.
LONG GetLowerBound(UINT uDim = 0) const;
Параметры
uDim
Измерение массива, для которого требуется получить нижнюю границу. Если опущено, значение по умолчанию равно 0.
Возвращаемое значение
Возвращает нижнюю границу.
Замечания
Если нижняя граница равен 0, это означает массив C-like, первый элемент которого — номер 0 элемента. В случае ошибки, например, недопустимый аргумент измерения, этот метод вызывается AtlThrow
с HRESULT
описанием ошибки.
CComSafeArray::GetSafeArrayPtr
Возвращает адрес элемента данных m_psa
.
LPSAFEARRAY* GetSafeArrayPtr() throw();
Возвращаемое значение
Возвращает указатель на CComSafeArray::m_psa
элемент данных.
CComSafeArray::GetType
Возвращает тип данных, хранящихся в массиве.
VARTYPE GetType() const;
Возвращаемое значение
Возвращает тип данных, хранящихся в массиве, который может быть любым из следующих типов:
VARTYPE |
Description |
---|---|
VT_I1 |
char |
VT_I2 |
short |
VT_I4 |
int |
VT_I4 |
long |
VT_I8 |
longlong |
VT_UI1 |
byte |
VT_UI2 |
ushort |
VT_UI4 |
uint |
VT_UI4 |
ulong |
VT_UI8 |
ulonglong |
VT_R4 |
float |
VT_R8 |
double |
VT_DECIMAL |
указатель типа decimal |
VT_VARIANT |
указатель типа variant |
VT_CY |
Currency - тип данных |
CComSafeArray::GetUpperBound
Возвращает верхнюю границу любого измерения массива.
LONG GetUpperBound(UINT uDim = 0) const;
Параметры
uDim
Измерение массива, для которого требуется получить верхнюю границу. Если опущено, значение по умолчанию равно 0.
Возвращаемое значение
Возвращает верхнюю границу. Это значение включает в себя максимальный допустимый индекс для этого измерения.
Замечания
В случае ошибки, например, недопустимый аргумент измерения, этот метод вызывается AtlThrow
с HRESULT
описанием ошибки.
CComSafeArray::IsSizable
Проверяет, можно ли изменить размер объекта CComSafeArray
.
bool IsSizable() const;
Возвращаемое значение
Возвращает TRUE
значение, если CComSafeArray
его можно изменить, FALSE
если это невозможно.
CComSafeArray::m_psa
Содержит адрес доступа к SAFEARRAY
структуре.
LPSAFEARRAY m_psa;
CComSafeArray::MultiDimGetAt
Получает один элемент из многомерного массива.
HRESULT MultiDimGetAt(const LONG* alIndex, T& t);
Параметры
alIndex
Указатель на вектор индексов для каждого измерения в массиве. Самое левое (самое важное) измерение alIndex[0]
.
t
Ссылка на возвращаемые данные.
Возвращаемое значение
Возвращает успешность S_OK
или ошибку HRESULT
при сбое.
CComSafeArray::MultiDimSetAt
Задает значение элемента в многомерном массиве.
HRESULT MultiDimSetAt(const LONG* alIndex, const T& t);
Параметры
alIndex
Указатель на вектор индексов для каждого измерения в массиве. Самым правым (наименее значительным) измерением alIndex[0]
является .
T
Указывает значение нового элемента.
Возвращаемое значение
Возвращает успешность S_OK
или ошибку HRESULT
при сбое.
Замечания
Это многомерная версия CComSafeArray::SetAt
.
CComSafeArray::operator []
Получает элемент из массива.
T& operator[](long lindex) const;
T& operator[](int nindex) const;
Параметры
lIndex
, nIndex
Номер индекса требуемого элемента в массиве.
Возвращаемое значение
Возвращает соответствующий элемент массива.
Замечания
Выполняет аналогичную функцию CComSafeArray::GetAt
, однако этот оператор работает только с одномерными массивами.
CComSafeArray::operator =
Оператор присвоения.
ATL::CComSafeArray<T>& operator=(const ATL::CComSafeArray& saSrc);
ATL::CComSafeArray<T>& operator=(const SAFEARRAY* psaSrc);
Параметры
saSrc
Ссылка на объект CComSafeArray
.
psaSrc
Указатель на объект SAFEARRAY
.
Возвращаемое значение
Возвращает тип данных, хранящихся в массиве.
CComSafeArray::operator LPSAFEARRAY
Приведение значения к указателю SAFEARRAY
.
operator LPSAFEARRAY() const;
Возвращаемое значение
Приведение значения к указателю SAFEARRAY
.
CComSafeArray::Resize
Изменяет размер объекта CComSafeArray
.
HRESULT Resize(const SAFEARRAYBOUND* pBound);
HRESULT Resize(ULONG ulCount, LONG lLBound = 0);
Параметры
pBound
Указатель на SAFEARRAYBOUND
структуру, содержащую сведения о количестве элементов и нижней границе массива.
ulCount
Запрошенное количество объектов в массиве с изменением размера.
lLBound
Нижняя граница.
Возвращаемое значение
Возвращает успешность S_OK
или ошибку HRESULT
при сбое.
Замечания
Этот метод изменяет размер только правого измерения. Он не изменит размер массивов, возвращаемых IsResizable
как FALSE
.
CComSafeArray::SetAt
Задает значение элемента в одномерном массиве.
HRESULT SetAt(LONG lIndex, const T& t, BOOL bCopy = TRUE);
Параметры
lIndex
Номер индекса заданного элемента массива.
t
Новое значение указанного элемента.
bCopy
Указывает, следует ли создать копию данных. Значение по умолчанию — TRUE
.
Возвращаемое значение
Возвращает успешность S_OK
или ошибку HRESULT
при сбое.
Замечания
Флаг bCopy
учитывается, когда элементы типа BSTR
или VARIANT
добавляются в массив. Значение TRUE
по умолчанию гарантирует, что новая копия создается из данных при добавлении элемента в массив.
См. также
SAFEARRAY
Тип данных
CComSafeArray::Create
CComSafeArray::Destroy
Общие сведения о классе