Класс COleSafeArray
Класс для работы с массивами произвольных типов и измерений.
Синтаксис
class COleSafeArray : public tagVARIANT
Участники
Открытые конструкторы
Имя | Описание |
---|---|
COle Сейф Array::COle Сейф Array | Формирует объект COleSafeArray . |
Открытые методы
Имя | Описание |
---|---|
COle Сейф Array::AccessData | Извлекает указатель на данные массива. |
COle Сейф Array::AllocData | Выделяет память для массива. |
COle Сейф Array::AllocDescriptor | Выделяет память для дескриптора безопасного массива. |
COle Сейф Array::Attach | Предоставляет элемент управления существующим VARIANT массивом объекту COleSafeArray . |
COle Сейф Array::Clear | Освобождает все данные в базовой VARIANT среде. |
COle Сейф Array::Copy | Создает копию существующего массива. |
COle Сейф Array::Create | Создает безопасный массив. |
COle Сейф Array::CreateOneDim | Создает одномерный COleSafeArray объект. |
COle Сейф Array::D etraits | Уничтожает существующий массив. |
COle Сейф Array::D edata | Уничтожает данные в безопасном массиве. |
COle Сейф Array::D escriptor | Уничтожает дескриптор безопасного массива. |
COle Сейф Array::D etach | Отсоединяет массив VARIANT от COleSafeArray объекта (чтобы данные не были освобождены). |
COle Сейф Array::GetByteArray | Копирует содержимое безопасного массива в CByteArray. |
COle Сейф Array::GetDim | Возвращает число измерений в массиве. |
COle Сейф Array::GetElement | Извлекает один элемент безопасного массива. |
COle Сейф Array::GetElemSize | Возвращает размер в байтах одного элемента в безопасном массиве. |
COle Сейф Array::GetLBound | Возвращает нижнюю границу для любого измерения безопасного массива. |
COle Сейф Array::GetOneDimSize | Возвращает количество элементов в одномерном COleSafeArray объекте. |
COle Сейф Array::GetUBound | Возвращает верхнюю границу для любого измерения безопасного массива. |
COle Сейф Array::Lock | Увеличивает число блокировок массива и помещает указатель на данные массива в дескрипторе массива. |
COle Сейф Array::P trOfIndex | Возвращает указатель на индексированные элементы. |
COle Сейф Array::P utElement | Помещает в массив один элемент. |
COle Сейф Array::Redim | Изменяет наименьшую значительную (правую) границу безопасного массива. |
COle Сейф Array::ResizeOneDim | Изменяет количество элементов в одномерном COleSafeArray объекте. |
COle Сейф Array::UnaccessData | Уменьшает количество блокировок массива и отменяет указатель, полученный с помощью AccessData . |
COle Сейф Array::Unlock | Уменьшает количество блокировок массива, чтобы его можно было освободить или изменить. |
Открытые операторы
Имя | Описание |
---|---|
COle Сейф Array::operator LPCVARIANT | Обращается к базовой VARIANT COleSafeArray структуре объекта. |
COle Сейф Array::operator LPVARIANT | Обращается к базовой VARIANT COleSafeArray структуре объекта. |
COle Сейф Array::operator = | Копирует значения в COleSafeArray объект (SAFEARRAY , или VARIANT COleVariant COleSafeArray массив). |
COle Сейф Array::operator == | Сравнивает два варианта массивов (SAFEARRAY , VARIANT COleVariant COleSafeArray или массивов). |
COleSafeArray::operator << |
Выводит содержимое COleSafeArray объекта в контекст дампа. |
Замечания
COleSafeArray
производный от структуры OLE VARIANT
. Функции-члены OLE SAFEARRAY
доступны COleSafeArray
через набор функций-членов, специально предназначенных для одномерных массивов байтов.
Иерархия наследования
tagVARIANT
COleSafeArray
Требования
Заголовок: afxdisp.h
COle Сейф Array::AccessData
Извлекает указатель на данные массива.
void AccessData(void** ppvData);
Параметры
ppvData
Указатель на указатель на данные массива.
Замечания
При ошибке функция создает исключение CMemoryException или COleException.
Пример
void CMainFrame::Sort(VARIANT* vArray)
{
COleSafeArray sa;
BSTR* pbstr;
TCHAR buf[1024];
LONG cElements, lLBound, lUBound;
//needed for OLE2T macro below, include afxpriv.h
USES_CONVERSION;
// Type check VARIANT parameter. It should contain a BSTR array
// passed by reference. The array must be passed by reference it is
// an in-out-parameter.
if (V_VT(vArray) != (VT_ARRAY | VT_BSTR))
{
AfxThrowOleDispatchException(1001,
_T("Type Mismatch in Parameter. Pass a string array by reference"));
}
// clears data in sa and copies the variant data into sa
sa.Attach(*vArray);
// Check that array is 1 dimensional
if (sa.GetDim() != 1)
{
AfxThrowOleDispatchException(1002,
_T("Type Mismatch in Parameter. Pass a one-dimensional array"));
}
try
{
// Get array bounds.
sa.GetLBound(1, &lLBound);
sa.GetUBound(1, &lUBound);
// Get a pointer to the elements of the array
// and increments the lock count on the array
sa.AccessData((LPVOID*)& pbstr);
//get no. of elements in array
cElements = lUBound - lLBound + 1;
for (int i = 0; i < cElements; i++)
{
//output the elements of the array
_stprintf_s(buf, 1024, _T("[%s]\n"), OLE2T(pbstr[i]));
OutputDebugString(buf);
}
//decrement lock count
sa.UnaccessData();
}
catch (COleException* pEx)
{
AfxThrowOleDispatchException(1003,
_T("Unexpected Failure in FastSort method"));
pEx->Delete();
}
}
COle Сейф Array::AllocData
Выделяет память для безопасного массива.
void AllocData();
Замечания
При ошибке функция создает исключение CMemoryException или COleException.
COle Сейф Array::AllocDescriptor
Выделяет память для дескриптора безопасного массива.
void AllocDescriptor(DWORD dwDims);
Параметры
dwDims
Количество измерений в безопасном массиве.
Замечания
При ошибке функция создает исключение CMemoryException или COleException.
COle Сейф Array::Attach
Предоставляет управление данными в существующем VARIANT
массиве объекту COleSafeArray
.
void Attach(VARIANT& varSrc);
Параметры
varSrc
Объект VARIANT
. Параметр varSrc должен иметь VT_ARRAY VARTYPE.
Замечания
Тип источника VARIANT
имеет значение VT_EMPTY. Эта функция очищает текущие данные массива, если таковые есть.
Пример
См. пример COle Сейф Array::AccessData.
COle Сейф Array::Clear
Очищает безопасный массив.
void Clear();
Замечания
Функция очищает безопасный массив, задав VARTYPE
объект VT_EMPTY. Текущее содержимое освобождается и массив освобождается.
COle Сейф Array::COle Сейф Array
Формирует объект COleSafeArray
.
COleSafeArray();
COleSafeArray(
const SAFEARRAY& saSrc,
VARTYPE vtSrc);
COleSafeArray(
LPCSAFEARRAY pSrc,
VARTYPE vtSrc);
COleSafeArray(const COleSafeArray& saSrc);
COleSafeArray(const VARIANT& varSrc);
COleSafeArray(LPCVARIANT pSrc);
COleSafeArray(const COleVariant& varSrc);
Параметры
saSrc
Существующий COleSafeArray
объект или SAFEARRAY
копируемый в новый COleSafeArray
объект.
vtSrc
VARTYPE нового COleSafeArray
объекта.
psaSrc
Указатель на копируемый SAFEARRAY
в новый COleSafeArray
объект.
varSrc
Существующий VARIANT
объект или COleVariant
объект, копируемый в новый COleSafeArray
объект.
Psrc
Указатель на VARIANT
объект, скопированный в новый COleSafeArray
объект.
Замечания
Все эти конструкторы создают новые COleSafeArray
объекты. Если нет параметра, создается пустой COleSafeArray
объект (VT_EMPTY). Если файл COleSafeArray
копируется из другого массива, тип VARTYPE которого известен неявно (илиCOleSafeArray
COleVariant
VARIANT
), VARTYPE исходного массива сохраняется и не нужно указывать. Если файл COleSafeArray
копируется из другого массива, тип VARTYPE которого не известен (SAFEARRAY
), в параметре vtSrc необходимо указать VARTYPE.
При ошибке функция создает исключение CMemoryException или COleException.
COle Сейф Array::Copy
Создает копию существующего безопасного массива.
void Copy(LPSAFEARRAY* ppsa);
Параметры
ppsa
Указатель на расположение, в котором возвращается дескриптор нового массива.
Замечания
При ошибке функция создает исключение CMemoryException или COleException.
COle Сейф Array::Create
Выделяет и инициализирует данные для массива.
void Create(
VARTYPE vtSrc,
DWORD dwDims,
DWORD* rgElements);
void Create(
VARTYPE vtSrc,
DWORD dwDims,
SAFEARRAYBOUND* rgsabounds);
Параметры
vtSrc
Базовый тип массива (то есть VARTYPE каждого элемента массива). VARTYPE ограничен подмножеством типов вариантов. Ни VT_ARRAY, ни флаг VT_BYREF не могут быть заданы. VT_EMPTY и VT_NULL недопустимы базовые типы для массива. Все остальные типы являются законными.
dwDims
Количество измерений в массиве. Это можно изменить после создания массива с помощью Redim.
rgElements
Указатель на массив количества элементов для каждого измерения в массиве.
rgsabounds
Указатель на вектор границ (по одному для каждого измерения), чтобы выделить для массива.
Замечания
Эта функция очищает текущие данные массива при необходимости. При ошибке функция создает исключение CMemoryException.
Пример
COleSafeArray saMatrix;
DWORD numElements[] = { 10, 5 };
// creates a 2 dimensional safearray of type VT_I2
// with size 10x5 elements, with all indices starting at 0(default)
saMatrix.Create(VT_I2, 2, numElements);
ASSERT(saMatrix.GetDim() == 2);
COleSafeArray saVector;
SAFEARRAYBOUND rgsabounds[] = { {5, 2} };
// creates a 1 dimensional safearray of type VT_I1
// with size 5 elements, with the index starting at 2
saVector.Create(VT_I1, 1, rgsabounds);
ASSERT(saVector.GetDim() == 1);
COle Сейф Array::CreateOneDim
Создает новый одномерный COleSafeArray
объект.
void CreateOneDim(
VARTYPE vtSrc,
DWORD dwElements,
const void* pvSrcData = NULL,
long nLBound = 0);
Параметры
vtSrc
Базовый тип массива (то есть VARTYPE каждого элемента массива).
dwElements
Количество элементов в массиве. Это можно изменить после создания массива с помощью ResizeOneDim.
pvSrcData
Указатель на данные для копирования в массив.
nLBound
Нижняя граница массива.
Замечания
Функция выделяет и инициализирует данные для массива, копируя указанные данные, если указатель pvSrcData не равен NULL.
При ошибке функция создает исключение CMemoryException.
Пример
VARIANT varColInfo[3];
//initialize VARIANTs
for (int i = 0; i < 3; i++)
VariantInit(&varColInfo[i]);
// Column Name
varColInfo[0].vt = VT_BSTR;
varColInfo[0].bstrVal = ::SysAllocString(L"Name");
// Column Type
varColInfo[1].vt = VT_UI4;
varColInfo[1].lVal = 1;
COleSafeArray sa;
//create a 1 dimensional safearray of VARIANTs
//& initialize it with varColInfo VARIANT array
sa.CreateOneDim(VT_VARIANT, 2, varColInfo);
//check that the dimension is 2
ASSERT(sa.GetOneDimSize() == 2);
//increase safearray size by 1
sa.ResizeOneDim(3);
// populate the last element of the safearray, (Column Size)
varColInfo[2].vt = VT_I4;
varColInfo[2].lVal = 30;
long el = 2;
sa.PutElement(&el, &varColInfo[2]);
COle Сейф Array::D etraits
Уничтожает существующий дескриптор массива и все данные в массиве.
void Destroy();
Замечания
Если объекты хранятся в массиве, каждый объект освобождается. При ошибке функция создает исключение CMemoryException или COleException.
COle Сейф Array::D edata
Уничтожает все данные в безопасном массиве.
void DestroyData();
Замечания
Если объекты хранятся в массиве, каждый объект освобождается. При ошибке функция создает исключение CMemoryException или COleException.
COle Сейф Array::D escriptor
Уничтожает дескриптор безопасного массива.
void DestroyDescriptor();
Замечания
При ошибке функция создает исключение CMemoryException или COleException.
COle Сейф Array::D etach
Отсоединяет VARIANT
данные от COleSafeArray
объекта.
VARIANT Detach();
Возвращаемое значение
Базовое VARIANT
COleSafeArray
значение объекта.
Замечания
Функция отсоединяет данные в безопасном массиве, задав VARTYPE объекта на VT_EMPTY. Вызывающий объект несет ответственность за освобождение массива путем вызова функции Windows VariantClear.
При ошибке функция вызывает COleException.
Пример
См. пример COle Сейф Array::P utElement.
COle Сейф Array::GetByteArray
Копирует содержимое безопасного массива в объект CByteArray
.
void GetByteArray(CByteArray& bytes);
Параметры
bytes
Ссылка на объект CByteArray .
COle Сейф Array::GetDim
Возвращает количество измерений в объекте COleSafeArray
.
DWORD GetDim();
Возвращаемое значение
Количество измерений в безопасном массиве.
Пример
COleSafeArray saMatrix;
DWORD numElements[] = { 10, 5 };
// creates a 2 dimensional safearray of type VT_I2
// with size 10x5 elements, with all indices starting at 0(default)
saMatrix.Create(VT_I2, 2, numElements);
ASSERT(saMatrix.GetDim() == 2);
COleSafeArray saVector;
SAFEARRAYBOUND rgsabounds[] = { {5, 2} };
// creates a 1 dimensional safearray of type VT_I1
// with size 5 elements, with the index starting at 2
saVector.Create(VT_I1, 1, rgsabounds);
ASSERT(saVector.GetDim() == 1);
COle Сейф Array::GetElement
Извлекает один элемент безопасного массива.
void GetElement(
long* rgIndices,
void* pvData);
Параметры
rgIndices
Указатель на массив индексов для каждого измерения массива.
pvData
Указатель на расположение для размещения элемента массива.
Замечания
Эта функция автоматически вызывает функции SafeArrayLock
Windows и SafeArrayUnlock
до и после извлечения элемента. Если элемент данных является строкой, объектом или вариантом, функция копирует элемент правильно. Параметр pvData должен указывать на достаточно большой буфер, чтобы содержать элемент.
При ошибке функция создает исключение CMemoryException или COleException.
Пример
//sa is of type COleSafeArray with 2 dimensions
//Determine upper bounds for both dimensions
long lNumRows;
long lNumCols;
sa.GetUBound(1, &lNumRows);
sa.GetUBound(2, &lNumCols);
//Display the elements in the SAFEARRAY.
long index[2];
VARIANT val;
//Determine lower bounds for both dimensions
long lowRow, lowCol;
sa.GetLBound(1, &lowRow);
sa.GetLBound(2, &lowCol);
for (long r = lowRow; r <= lNumRows; r++)
{
for (long c = lowCol; c <= lNumCols; c++)
{
index[0] = r;
index[1] = c;
//retrieve each element of the safearray
sa.GetElement(index, &val);
switch (val.vt)
{
case VT_R8:
TRACE(_T("%1.2f\n"), val.dblVal);
break;
case VT_BSTR:
TRACE(_T("%s\n"), (CString)val.bstrVal);
break;
// other cases omitted
case VT_EMPTY:
TRACE(_T("<empty>\n"));
break;
}
}
}
COle Сейф Array::GetElemSize
Извлекает размер элемента в объекте COleSafeArray
.
DWORD GetElemSize();
Возвращаемое значение
Размер элементов безопасного массива в байтах.
COle Сейф Array::GetLBound
Возвращает нижнюю границу для любого измерения COleSafeArray
объекта.
void GetLBound(
DWORD dwDim,
long* pLBound);
Параметры
dwDim
Измерение массива, для которого требуется получить нижнюю границу.
pLBound
Указатель на расположение для возврата нижней границы.
Замечания
При ошибке функция вызывает COleException.
Пример
COleSafeArray saMatrix;
DWORD numElements[] = { 10, 5 };
// creates a 2 dimensional safearray of type VT_I2
// with size 10x5 elements, with all indices starting at 0(default)
saMatrix.Create(VT_I2, 2, numElements);
long lLBound;
//get lower bound for 1st dimension
saMatrix.GetLBound(1, &lLBound);
ASSERT(lLBound == 0);
//get lower for 2nd dimension
saMatrix.GetLBound(2, &lLBound);
ASSERT(lLBound == 0);
COleSafeArray saVector;
SAFEARRAYBOUND rgsabounds[] = { {5, 1} };
// creates a 1 dimensional safearray of type VT_I1
// with size 5 elements, with the index starting at 1
saVector.Create(VT_I1, 1, rgsabounds);
//get lower bound for 1st dimension
saVector.GetLBound(1, &lLBound);
ASSERT(lLBound == 1);
COle Сейф Array::GetOneDimSize
Возвращает количество элементов в одномерном COleSafeArray
объекте.
DWORD GetOneDimSize();
Возвращаемое значение
Количество элементов в одномерном безопасном массиве.
Пример
См. пример COle Сейф Array::CreateOneDim.
COle Сейф Array::GetUBound
Возвращает верхнюю границу для любого измерения безопасного массива.
void GetUBound(
DWORD dwDim,
long* pUBound);
Параметры
dwDim
Измерение массива, для которого требуется получить верхнюю границу.
pUBound
Указатель на расположение, чтобы вернуть верхнюю границу.
Замечания
При ошибке функция вызывает COleException.
Пример
COleSafeArray saMatrix;
DWORD numElements[] = { 10, 5 };
// creates a 2 dimensional safearray of type VT_I2
// with size 10x5 elements, with all indices starting at 0(default)
saMatrix.Create(VT_I2, 2, numElements);
long lUBound;
ASSERT(saMatrix.GetDim() == 2);
//get upper bound for 1st dimension
saMatrix.GetUBound(1, &lUBound);
ASSERT(lUBound == 9);
//get upper bound for 2nd dimension
saMatrix.GetUBound(2, &lUBound);
ASSERT(lUBound == 4);
COleSafeArray saVector;
SAFEARRAYBOUND rgsabounds[] = { {5, 1} };
// creates a 1 dimensional safearray of type VT_I1
// with size 5 elements, with the index starting at 1
saVector.Create(VT_I1, 1, rgsabounds);
//get upper bound for 1st dimension
saVector.GetUBound(1, &lUBound);
ASSERT(lUBound == 5);
COle Сейф Array::Lock
Увеличивает число блокировок массива и помещает указатель на данные массива в дескриптор массива.
void Lock();
Замечания
При ошибке возникает исключение COleException.
Указатель в дескрипторе массива действителен до вызова Unlock
. Lock
Вызовы могут быть вложенными; требуется равное количество вызововUnlock
.
Невозможно удалить массив во время блокировки.
COle Сейф Array::operator LPCVARIANT
Вызовите этот оператор приведения, чтобы получить доступ к базовой VARIANT
структуре для этого COleSafeArray
объекта.
operator LPCVARIANT() const;
COle Сейф Array::operator LPVARIANT
Вызовите этот оператор приведения, чтобы получить доступ к базовой VARIANT
структуре для этого COleSafeArray
объекта.
operator LPVARIANT();
Замечания
Обратите внимание, что изменение значения в VARIANT
структуре, к которому обращается указатель, возвращаемый этой функцией, изменит значение этого COleSafeArray
объекта.
COle Сейф Array::operator =
Эти перегруженные операторы назначения копируют исходное значение в этот COleSafeArray
объект.
COleSafeArray& operator=(const COleSafeArray& saSrc);
COleSafeArray& operator=(const VARIANT& varSrc);
COleSafeArray& operator=(LPCVARIANT pSrc);
COleSafeArray& operator=(const COleVariant& varSrc);
Замечания
Краткое описание каждого оператора выглядит следующим образом:
оператор =(saSrc) копирует существующий
COleSafeArray
объект в этот объект.оператор =(varSrc) копирует существующий
VARIANT
илиCOleVariant
массив в этот объект.оператор =(pSrc) Копирует объект массива,
VARIANT
к которым обращается pSrc в этот объект.
COle Сейф Array::operator ==
Этот оператор сравнивает два массива (SAFEARRAY
, или COleVariant
VARIANT
COleSafeArray
массивы) и возвращает ненулевое значение, если они равны; в противном случае — 0.
BOOL operator==(const SAFEARRAY& saSrc) const; BOOL operator==(LPCSAFEARRAY pSrc) const;
BOOL operator==(const COleSafeArray& saSrc) const; BOOL operator==(const VARIANT& varSrc) const;
BOOL operator==(LPCVARIANT pSrc) const; BOOL operator==(const COleVariant& varSrc) const;
Замечания
Два массива равны, если они имеют равное число измерений, равный размер в каждом измерении и равные значения элементов.
COleSafeArray::operator <<
Оператор COleSafeArray
вставки (<<) поддерживает дамп диагностики COleSafeArray
и хранение объекта в архив.
CDumpContext& AFXAPI operator<<(
CDumpContext& dc,
COleSafeArray& saSrc);
COle Сейф Array::P trOfIndex
Возвращает указатель на элемент, заданный значениями индекса.
void PtrOfIndex(
long* rgIndices,
void** ppvData);
Параметры
rgIndices
Массив значений индекса, определяющий элемент массива. Все индексы элемента должны быть указаны.
ppvData
При возврате указатель на элемент, определяемый значениями в rgIndices.
COle Сейф Array::P utElement
Помещает в массив один элемент.
void PutElement(
long* rgIndices,
void* pvData);
Параметры
rgIndices
Указатель на массив индексов для каждого измерения массива.
pvData
Указатель на данные, которые требуется поместить в массив. VT_DISPATCH, VT_UNKNOWN и VT_BSTR типы вариантов являются указателями и не требуют другого уровня косвенного обращения.
Замечания
Эта функция автоматически вызывает функции Windows Сейф ArrayLock и Сейф ArrayUnlock до и после назначения элемента. Если строка, объект или вариант являются элементом данных, функция выполняет правильное копирование, а если существующим элементом — правильное удаление.
Обратите внимание, для массива можно настроить несколько блокировок, поэтому вы можете поместить в него элементы, недоступные для других операций.
При ошибке функция создает исключение CMemoryException или COleException.
Пример
VARIANT retVariantArray()
{
COleSafeArray saRet;
DWORD numElements[] = { 10, 10 }; // 10x10
// Create the 2 dimensional safe-array of type VT_R8 with size 10x10
saRet.Create(VT_R8, 2, numElements);
// Initialize safearray with values...
long index[2];
for (index[0] = 0; index[0] < 10; index[0]++)
{
for (index[1] = 0; index[1] < 10; index[1]++)
{
double val = index[0] + index[1] * 10;
//populate the safearray elements with double values
saRet.PutElement(index, &val);
}
}
// Return the safe-array encapsulated in a VARIANT...
return saRet.Detach();
}
COle Сейф Array::Redim
Изменяет наименьшую значительную (правую) границу безопасного массива.
void Redim(SAFEARRAYBOUND* psaboundNew);
Параметры
psaboundNew
Указатель на новую структуру с привязкой к безопасному массиву, содержащую новую привязку массива. Может быть изменено только наименьшее значительное измерение массива.
Замечания
При ошибке функция вызывает COleException.
COle Сейф Array::ResizeOneDim
Изменяет количество элементов в одномерном COleSafeArray
объекте.
void ResizeOneDim(DWORD dwElements);
Параметры
dwElements
Количество элементов в одномерном безопасном массиве.
Замечания
При ошибке функция вызывает COleException.
Пример
См. пример COle Сейф Array::CreateOneDim.
COle Сейф Array::UnaccessData
Уменьшает количество блокировок массива и отменяет указатель, полученный с помощью AccessData
.
void UnaccessData();
Замечания
При ошибке функция вызывает COleException.
Пример
См. пример COle Сейф Array::AccessData.
COle Сейф Array::Unlock
Уменьшает количество блокировок массива, чтобы его можно было освободить или изменить.
void Unlock();
Замечания
Эта функция вызывается после завершения доступа к данным в массиве. При ошибке возникает исключение COleException.
См. также
Диаграмма иерархии
Класс COleVariant
Класс CRecordset
Класс CDatabase
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по