COleSafeArray

COleSafeArray类是用于处理任意类型和维数的数组的类。COleSafeArray是从OLE VARIANT结构派生而来的。OLE SAFEARRAY成员函数在可以通过COleSafeArray来访问,就象是特别为一维的字节数组所设计的一个成员函数集。
#include <afxdisp.h>

COleSafeArray::COleSafeArray

COleSafeArray();
COleSafeArray( const SAFEARRAY& saSrc, VARTYPE vtSrc );
COleSafeArray( LPCSAFEARRAY psaSrc, 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)。如果COleSafeArray是从另一个数组拷贝来的,并且这个数组的VARTYPE并不是完全确定的(一个COleSafeArray,COleVariant,或者VARIANT),则源数组中的VARTYPE被保留,并且不需要说明。如果COleSafeArray是从另一个数组拷贝而来,并且该数组的VARTYPE是不知道的,则VARTYPE必须用vtSrc参数来指定。
如果出错,则函数抛出一个CMemoryException或COleException。

请参阅:VariantCopy

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

unsigned char* CMatZDConvert::readBlob( _RecordsetPtr rs,LPCTSTR blobFldName,long& size,long bufSize)
{

 ADODB::FieldPtr  imageFld  = rs->Fields->Item[ blobFldName ];

 size = imageFld->ActualSize;

 if ( size > 0 ){  

  unsigned char*  buf =  new unsigned char[size];

  long  bufPos = 0;

  for (long  offset = 0;  offset < size;offset = offset + bufSize )
  {
   _variant_t varChunk = imageFld->GetChunk(bufSize);

   for(long index=0; index<=(bufSize-1); index++)
   {
    if ( SUCCEEDED(SafeArrayGetElement(varChunk.parray,&index, buf + bufPos) ))

     ++bufPos;
    else
     break;
   }     
  }

  // 读取成功

  if ( size == bufPos )

   return buf;

  delete []buf;
 }

 return 0;
}
bool CMatZDConvert::writeBlob( ADODB::Recordset15Ptr rs, std::string blobFldName, unsigned char* buf, long size)
{
 if ( size > 0 )
 {
  COleSafeArray imageData;
  LPBYTE   data = 0 ;
  imageData.CreateOneDim( VT_UI1, size);
  imageData.AccessData((LPVOID*) &data);
  memcpy( data, buf, size );
  imageData.UnaccessData();
  rs->Collect[blobFldName.c_str()] = *(LPCVARIANT)imageData;
  return true;
 }
 return false;
}

你可能感兴趣的:(COleSafeArray)