次の方法で共有


CComSafeArray クラス

このクラスは、SAFEARRAY 構造体用のラッパーです。

構文

template <typename T, VARTYPE _vartype = _ATL_AutomationType<T>::type>
class CComSafeArray

パラメーター

T
配列に格納されるデータの型。

メンバー

パブリック コンストラクター

名前 説明
CComSafeArray::CComSafeArray コンストラクター。
CComSafeArray::~CComSafeArray デストラクター。

パブリック メソッド

名前 説明
CComSafeArray::Add 1 つまたは複数の要素、あるいは 1 つの SAFEARRAY 構造体を CComSafeArray に追加します。
CComSafeArray::Attach SAFEARRAY 構造体を CComSafeArray オブジェクトにアタッチします。
CComSafeArray::CopyFrom SAFEARRAY 構造体のコンテンツを CComSafeArray オブジェクトにコピーします。
CComSafeArray::CopyTo CComSafeArray オブジェクトのコピーを作成します。
CComSafeArray::Create CComSafeArray オブジェクトを作成します。
CComSafeArray::Destroy CComSafeArray オブジェクトを破棄します。
CComSafeArray::Detach CComSafeArray オブジェクトから SAFEARRAY をデタッチします。
CComSafeArray::GetAt 1 次元配列から 1 つの要素を取得します。
CComSafeArray::GetCount 配列内の要素の数を返します。
CComSafeArray::GetDimensions 配列内の次元数を返します。
CComSafeArray::GetLowerBound 配列の指定した次元の下限を返します。
CComSafeArray::GetSafeArrayPtr m_psa データ メンバーのアドレスを返します。
CComSafeArray::GetType 配列に格納されているデータの型を返します。
CComSafeArray::GetUpperBound 配列の任意の次元の上限を返します。
CComSafeArray::IsSizable CComSafeArray オブジェクトのサイズを変更できるかどうかをテストします。
CComSafeArray::MultiDimGetAt 多次元配列から 1 つの要素を取得します。
CComSafeArray::MultiDimSetAt 多次元配列の要素の値を設定します。
CComSafeArray::Resize CComSafeArray オブジェクトのサイズを変更します。
CComSafeArray::SetAt 1 次元配列の要素の値を設定します。

パブリック演算子

名前 説明
CComSafeArray::operator LPSAFEARRAY 値を SAFEARRAY ポインターにキャストします。
CComSafeArray::operator[] 配列から要素を取得します。
CComSafeArray::operator = 代入演算子。

パブリック データ メンバー

名前 説明
CComSafeArray::m_psa このデータ メンバーで SAFEARRAY 構造体のアドレスが保持されます。

解説

CComSafeArray は、SAFEARRAY データ型クラスのラッパーを提供して、ほぼすべてのサポートされている VARIANT 型の 1 次元配列と多次元配列を簡単に作成および管理できるようにします。

CComSafeArray によりプロセス間での配列の受け渡しが単純化され、配列インデックスの値を上限と下限に照合することでセキュリティがさらに向上します。

CComSafeArray の下限は任意のユーザー定義値で開始できますが、C++ を通じてアクセスされる配列の下限は 0 にする必要があります。 Visual Basic などの他の言語では、別の境界値 (たとえば、-10 ~ 10) を使用できます。

CComSafeArray::Create を使用して CComSafeArray オブジェクトを作成し、CComSafeArray::Destroy を使用して削除します。

CComSafeArray には、VARIANT データ型の次のサブセットを格納できます。

VARTYPE 説明
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 10 進ポインター
VT_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

1 つまたは複数の要素、あるいは 1 つの SAFEARRAY 構造体を CComSafeArray に追加します。

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
配列に追加する 1 つまたは複数のオブジェクトへのポインター。

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

CComSafeArray オブジェクトから SAFEARRAY をデタッチします。

LPSAFEARRAY Detach();

戻り値

SAFEARRAY オブジェクトへのポインターを返します。

解説

このメソッドでは、SAFEARRAY オブジェクトを CComSafeArray オブジェクトからデタッチします。

CComSafeArray::GetAt

1 次元配列から 1 つの要素を取得します。

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 の場合、これは、最初の要素が要素番号 0 である C のような配列を示します。 たとえば、無効な次元引数などのエラーが発生した場合、このメソッドでは、そのエラーを説明する HRESULT を使用して AtlThrow を呼び出します。

CComSafeArray::GetSafeArrayPtr

m_psa データ メンバーのアドレスを返します。

LPSAFEARRAY* GetSafeArrayPtr() throw();

戻り値

CComSafeArray::m_psa データ メンバーを指すポインターを返します。

CComSafeArray::GetType

配列に格納されているデータの型を返します。

VARTYPE GetType() const;

戻り値

配列に格納されているデータの型を返します。これは次のいずれかの型になります。

VARTYPE 説明
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 10 進ポインター
VT_VARIANT バリアント ポインター
VT_CY Currency データ型

CComSafeArray::GetUpperBound

配列の任意の次元の上限を返します。

LONG GetUpperBound(UINT uDim = 0) const;

パラメーター

uDim
上限を取得する対象の配列の次元。 省略した場合、既定値は 0 となります。

戻り値

上限を返します。 この値には、この次元の有効な最大インデックス数が含まれます。

解説

たとえば、無効な次元引数などのエラーが発生した場合、このメソッドでは、そのエラーを説明する HRESULT を使用して AtlThrow を呼び出します。

CComSafeArray::IsSizable

CComSafeArray オブジェクトのサイズを変更できるかどうかをテストします。

bool IsSizable() const;

戻り値

CComSafeArray のサイズを変更できる場合は TRUE、できない場合は FALSE を返します。

CComSafeArray::m_psa

アクセスされる SAFEARRAY 構造体のアドレスを保持します。

LPSAFEARRAY m_psa;

CComSafeArray::MultiDimGetAt

多次元配列から 1 つの要素を取得します。

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 と同様の関数を実行しますが、この演算子は 1 次元配列でのみ機能します。

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 を返します。

解説

このメソッドでは、右端の次元のサイズのみを変更します。 FALSE として IsResizable を返す配列のサイズは変更しません。

CComSafeArray::SetAt

1 次元配列の要素の値を設定します。

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
クラスの概要