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;
}