次の方法で共有


COleSafeArray クラス

任意の型および次元の配列を扱うクラスです。

構文

class COleSafeArray : public tagVARIANT

メンバー

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

名前 説明
COleSafeArray::COleSafeArray COleSafeArray オブジェクトを構築します。

パブリック メソッド

名前 説明
COleSafeArray::AccessData 配列データへのポインターを取得します。
COleSafeArray::AllocData 配列のメモリを割り当てます。
COleSafeArray::AllocDescriptor セーフ配列記述子のメモリを割り当てます。
COleSafeArray::Attach 既存の VARIANT 配列を COleSafeArray オブジェクトに制御します。
COleSafeArray::Clear 基になる VARIANT内のすべてのデータを解放します。
COleSafeArray::Copy 既存の配列のコピーを作成します。
COleSafeArray::Create 安全な配列を作成します。
COleSafeArray::CreateOneDim 1 次元 COleSafeArray オブジェクトを作成します。
COleSafeArray::D estroy 既存の配列を破棄します。
COleSafeArray::D estroyData セーフ配列内のデータを破棄します。
COleSafeArray::D estroyDescriptor セーフ配列の記述子を破棄します。
COleSafeArray::D etach データが解放されないように、 COleSafeArray オブジェクトから VARIANT 配列をデタッチします。
COleSafeArray::GetByteArray セーフ配列の内容を CByteArray にコピーします。
COleSafeArray::GetDim 配列内の次元数を返します。
COleSafeArray::GetElement セーフ配列の 1 つの要素を取得します。
COleSafeArray::GetElemSize セーフ配列内の 1 つの要素のサイズをバイト単位で返します。
COleSafeArray::GetLBound セーフ配列の次元の下限を返します。
COleSafeArray::GetOneDimSize 1 次元の COleSafeArray オブジェクト内の要素の数を返します。
COleSafeArray::GetUBound セーフ配列の次元の上限を返します。
COleSafeArray::Lock 配列のロックカウントをインクリメントし、配列記述子内の配列データへのポインターを配置します。
COleSafeArray::P trOfIndex インデックス付き要素へのポインターを返します。
COleSafeArray::P utElement 1 つの要素を配列に割り当てます。
COleSafeArray::Redim セーフ配列の最下位 (右端) の境界を変更します。
COleSafeArray::ResizeOneDim 1 次元の COleSafeArray オブジェクト内の要素の数を変更します。
COleSafeArray::UnaccessData 配列のロックカウントをデクリメントし、 AccessDataによって取得されたポインターを無効にします。
COleSafeArray::Unlock 解放またはサイズ変更できるように、配列のロック数をデクリメントします。

パブリック演算子

名前 説明
COleSafeArray::operator LPCVARIANT COleSafeArray オブジェクトの基になるVARIANT構造体にアクセスします。
COleSafeArray::operator LPVARIANT COleSafeArray オブジェクトの基になるVARIANT構造体にアクセスします。
COleSafeArray::operator = 値を COleSafeArray オブジェクト (SAFEARRAYVARIANTCOleVariant、または配列 COleSafeArray ) にコピーします。
COleSafeArray::operator == 2 つのバリアント配列 (SAFEARRAYVARIANTCOleVariant、または COleSafeArray 配列) を比較します。
COleSafeArray::operator << COleSafeArray オブジェクトの内容をダンプ コンテキストに出力します。

解説

COleSafeArray は OLE VARIANT 構造体から派生します。 OLE SAFEARRAY メンバー関数は、 COleSafeArrayだけでなく、バイトの 1 次元配列用に特別に設計されたメンバー関数のセットを使用して使用できます。

継承階層

tagVARIANT

COleSafeArray

要件

ヘッダー : afxdisp.h

COleSafeArray::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();
   }
}

COleSafeArray::AllocData

セーフ配列のメモリを割り当てます。

void AllocData();

解説

エラーが発生すると、関数は CMemoryException または COleException をスローします。

COleSafeArray::AllocDescriptor

セーフ配列の記述子にメモリを割り当てます。

void AllocDescriptor(DWORD dwDims);

パラメーター

dwDims
セーフ配列内の次元の数。

解説

エラーが発生すると、関数は CMemoryException または COleException をスローします。

COleSafeArray::Attach

既存の VARIANT 配列内のデータを COleSafeArray オブジェクトに制御します。

void Attach(VARIANT& varSrc);

パラメーター

varSrc
VARIANT オブジェクト。 varSrc パラメーターには VARTYPE VT_ARRAYが必要です。

解説

ソース VARIANTの型は VT_EMPTY に設定されます。 この関数は、現在の配列データ (存在する場合) をクリアします。

COleSafeArray::AccessData の例を参照してください。

COleSafeArray::Clear

セーフ配列をクリアします。

void Clear();

解説

この関数は、オブジェクトの VARTYPE をVT_EMPTYに設定することで、安全な配列をクリアします。 現在の内容が解放され、配列が解放されます。

COleSafeArray::COleSafeArray

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 オブジェクトにコピーする既存のCOleSafeArray オブジェクトまたはSAFEARRAY

vtSrc
新しい COleSafeArray オブジェクトの VARTYPE。

psaSrc
新しいCOleSafeArray オブジェクトにコピーするSAFEARRAYへのポインター。

varSrc
新しい COleSafeArray オブジェクトにコピーする既存の VARIANT または COleVariant オブジェクト。

pSrc
新しいCOleSafeArray オブジェクトにコピーするVARIANT オブジェクトへのポインター。

解説

これらのコンストラクターはすべて、新しい COleSafeArray オブジェクトを作成します。 パラメーターがない場合は、空の COleSafeArray オブジェクトが作成されます (VT_EMPTY)。 VARTYPE が暗黙的に認識されている別の配列 (COleSafeArrayCOleVariant、またはVARIANT) からCOleSafeArrayがコピーされる場合、ソース配列の VARTYPE は保持され、指定する必要はありません。 VARTYPE が不明な (SAFEARRAY) 別の配列からCOleSafeArrayをコピーする場合は、varTYPE を vtSrc パラメーターで指定する必要があります。

エラーが発生すると、関数は CMemoryException または COleException をスローします。

COleSafeArray::Copy

既存のセーフ配列のコピーを作成します。

void Copy(LPSAFEARRAY* ppsa);

パラメーター

ppsa
新しい配列記述子を返す場所へのポインター。

解説

エラーが発生すると、関数は CMemoryException または COleException をスローします。

COleSafeArray::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
配列に割り当てる境界のベクトル (次元ごとに 1 つ) へのポインター。

解説

この関数は、必要に応じて現在の配列データをクリアします。 エラーが発生すると、関数は 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);

COleSafeArray::CreateOneDim

新しい 1 次元 COleSafeArray オブジェクトを作成します。

void CreateOneDim(
    VARTYPE vtSrc,
    DWORD dwElements,
    const void* pvSrcData = NULL,
    long nLBound = 0);

パラメーター

vtSrc
配列の基本型 (つまり、配列の各要素の VARTYPE)。

dwElements
配列内の要素の数。 これは、配列が ResizeOneDim で作成された後に変更できます。

pvSrcData
配列にコピーするデータへのポインター。

nLBound
配列の下限。

解説

この関数は配列のデータを割り当てて初期化し、ポインターが null でない場合 pvSrcData 指定したデータをコピーします。

エラーが発生すると、関数は 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]);

COleSafeArray::D estroy

既存の配列記述子と配列内のすべてのデータを破棄します。

void Destroy();

解説

オブジェクトが配列に格納されている場合、各オブジェクトは解放されます。 エラーが発生すると、関数は CMemoryException または COleException をスローします。

COleSafeArray::D estroyData

セーフ配列内のすべてのデータを破棄します。

void DestroyData();

解説

オブジェクトが配列に格納されている場合、各オブジェクトは解放されます。 エラーが発生すると、関数は CMemoryException または COleException をスローします。

COleSafeArray::D estroyDescriptor

セーフ配列の記述子を破棄します。

void DestroyDescriptor();

解説

エラーが発生すると、関数は CMemoryException または COleException をスローします。

COleSafeArray::D etach

COleSafeArray オブジェクトからVARIANT データをデタッチします。

VARIANT Detach();

戻り値

COleSafeArray オブジェクトの基になるVARIANT値。

解説

この関数は、オブジェクトの VARTYPE を VT_EMPTYに設定することで、セーフ配列内のデータをデタッチします。 Windows 関数 VariantClear を呼び出すことによって、配列を解放するのは呼び出し元の責任です。

エラーが発生すると、関数は COleException をスローします。

COleSafeArray::P utElement の例を参照してください。

COleSafeArray::GetByteArray

セーフ配列の内容を CByteArrayにコピーします。

void GetByteArray(CByteArray& bytes);

パラメーター

bytes
CByteArray オブジェクトへの参照。

COleSafeArray::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);

COleSafeArray::GetElement

セーフ配列の 1 つの要素を取得します。

void GetElement(
    long* rgIndices,
    void* pvData);

パラメーター

rgIndices
インデックスの配列へのポインター (配列の次元ごと)。

pvData
配列の要素を配置する場所へのポインター。

解説

この関数は、要素を取得する前と後に、 SafeArrayLock および 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;
      }
   }
}

COleSafeArray::GetElemSize

COleSafeArray オブジェクト内の要素のサイズを取得します。

DWORD GetElemSize();

戻り値

セーフ配列の要素のサイズ (バイト単位)。

COleSafeArray::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);

COleSafeArray::GetOneDimSize

1 次元の COleSafeArray オブジェクト内の要素の数を返します。

DWORD GetOneDimSize();

戻り値

1 次元セーフ配列内の要素の数。

COleSafeArray::CreateOneDim の例を参照してください。

COleSafeArray::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);

COleSafeArray::Lock

配列のロックカウントをインクリメントし、配列記述子内の配列データへのポインターを配置します。

void Lock();

解説

エラーが発生すると、 COleException がスローされます。

配列記述子内のポインターは、 Unlock が呼び出されるまで有効です。 Lockの呼び出しは入れ子にすることができます。Unlockの呼び出しの数が同じである必要があります。

ロックされている間は、配列を削除できません。

COleSafeArray::operator LPCVARIANT

この COleSafeArray オブジェクトの基になる VARIANT 構造体にアクセスするには、このキャスト演算子を呼び出します。

operator LPCVARIANT() const;

COleSafeArray::operator LPVARIANT

この COleSafeArray オブジェクトの基になる VARIANT 構造体にアクセスするには、このキャスト演算子を呼び出します。

operator LPVARIANT();

解説

この関数によって返されるポインターによってアクセスされる VARIANT 構造体の値を変更すると、この COleSafeArray オブジェクトの値が変更されることに注意してください。

COleSafeArray::operator =

これらのオーバーロードされた代入演算子を使うと、ソース値をこの COleSafeArray オブジェクトにコピーすることができます。

COleSafeArray& operator=(const COleSafeArray& saSrc);
COleSafeArray& operator=(const VARIANT& varSrc);
COleSafeArray& operator=(LPCVARIANT pSrc);
COleSafeArray& operator=(const COleVariant& varSrc);

注釈

各演算子の簡単な説明を次に示します。

  • operator =( saSrc ) 既存の COleSafeArray オブジェクトをこのオブジェクトにコピーします。

  • operator =( varSrc ) 既存の VARIANT または COleVariant 配列をこのオブジェクトにコピーします。

  • operator =( pSrc ) pSrc によってアクセスされたVARIANT配列オブジェクトをこのオブジェクトにコピーします。

COleSafeArray::operator ==

この演算子は、2 つの配列 (SAFEARRAYVARIANTCOleVariant、または COleSafeArray 配列) を比較し、等しい場合は 0 以外の値を返します。それ以外の場合は 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;

解説

2 つの配列は、等しい次元数、各次元のサイズが等しい場合、および等しい要素値を持つ場合に等しくなります。

COleSafeArray::operator <<

COleSafeArray挿入 (<<) 演算子は、COleSafeArray オブジェクトのアーカイブへの診断ダンプと格納をサポートします。

CDumpContext& AFXAPI operator<<(
    CDumpContext& dc,
    COleSafeArray& saSrc);

COleSafeArray::P trOfIndex

インデックス値で指定された要素へのポインターを返します。

void PtrOfIndex(
    long* rgIndices,
    void** ppvData);

パラメーター

rgIndices
配列の要素を識別するインデックス値の配列。 要素のすべてのインデックスを指定する必要があります。

ppvData
戻り時に、 rgIndices の値によって識別される要素へのポインター。

COleSafeArray::P utElement

1 つの要素を配列に割り当てます。

void PutElement(
    long* rgIndices,
    void* pvData);

パラメーター

rgIndices
インデックスの配列へのポインター (配列の次元ごと)。

pvData
配列に割り当てるデータへのポインター。 VT_DISPATCH、VT_UNKNOWN、およびVT_BSTRバリアント型はポインターであり、別のレベルの間接参照は必要ありません。

解説

この関数は、要素を割り当てる前と後 SafeArrayLockSafeArrayUnlock の Windows 関数を自動的に呼び出します。 データ要素が文字列、オブジェクト、バリアントの場合は、関数によって適切にコピーされ、既存の要素が文字列、オブジェクト、バリアントの場合は、関数によって適切にクリアされます。

配列は多重にロックできるため、配列が別の操作によってロックされている間に要素を配列に配置できることに注意してください。

エラーが発生すると、関数は 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();
}

COleSafeArray::Redim

セーフ配列の最下位 (右端) の境界を変更します。

void Redim(SAFEARRAYBOUND* psaboundNew);

パラメーター

psboundNew
新しい配列バインドを含む、新しい安全な配列バインド構造体へのポインター。 変更できるのは、配列の最下位次元だけです。

解説

エラーが発生すると、関数は COleException をスローします。

COleSafeArray::ResizeOneDim

1 次元の COleSafeArray オブジェクト内の要素の数を変更します。

void ResizeOneDim(DWORD dwElements);

パラメーター

dwElements
1 次元セーフ配列内の要素の数。

解説

エラーが発生すると、関数は COleException をスローします。

COleSafeArray::CreateOneDim の例を参照してください。

COleSafeArray::UnaccessData

配列のロックカウントをデクリメントし、 AccessDataによって取得されたポインターを無効にします。

void UnaccessData();

解説

エラーが発生すると、関数は COleException をスローします。

COleSafeArray::AccessData の例を参照してください。

COleSafeArray::Unlock

解放またはサイズ変更できるように、配列のロック数をデクリメントします。

void Unlock();

解説

この関数は、配列内のデータへのアクセスが完了した後に呼び出されます。 エラーが発生すると、 COleException がスローされます。

関連項目

階層図
COleVariant クラス
CRecordset クラス
CDatabase クラス