//
// 作者:童方
// QQ:58408454
// VARIANT中存取数组,本例以BYTE数组为例
// 本例适用于VARIANT中存取一维数组
//
// 功能:从VARIANT中读取BYTE数组
// 参数v:存储Byte数组的Variant变量
// 参数lpByteArray:输出字节数组,大小由GetByteArrayFromVariant的返回值决定
// 返回值:Variant中的数组元素个数
int GetByteArrayFromVariant(VARIANT& v, BYTE* lpByteArray)
{
int nRet = 0;
if(v.vt == (VT_ARRAY | VT_UI1))
{
BYTE* pByte;
try
{
::SafeArrayAccessData(v.parray, (void **)&pByte);
nRet = v.parray->rgsabound->cElements;
if(lpByteArray)
memcpy(lpByteArray, pByte, nRet);
::SafeArrayUnaccessData(v.parray);
}
catch(...)
{
nRet = -1;
}
}
return nRet;
}
//
// 功能:向Variant对象中存储BYTE数组
// 参数v:用于存储Byte数组的Variant对象指针
// 参数lpByteArray:需要向Variant对象中存储的数据
// 参数nLength:存储数据元素个数
// 返回值: 存储是否成功
BOOL SetByteArrayToVariant(VARIANT* v, BYTE* lpByteArray, int nLength)
{
try
{
SAFEARRAY* psa = NULL;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = nLength;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
for(long i=0; i<nLength; i++)
SafeArrayPutElement(psa, &i, &lpByteArray[i]);
v->vt = VT_ARRAY | VT_UI1;
v->parray = psa;
}
catch(...)
{
return FALSE;
}
return TRUE;
}
//
// 使用示例
void Test()
{
BYTE Data[100];
int i;
for(i=0; i<100; i++)
Data[i] = i + 1;
VARIANT v;
VariantInit(&v);
SetByteArrayToVariant(&v, Data, 100);
int nLength = GetByteArrayFromVariant(v, NULL);
ASSERT(nLength == 100);
BYTE * Data1 = new BYTE[nLength];
GetByteArrayFromVariant(v, Data1);
for(i=0; i<nLength; i++)
{
ASSERT(Data[i] == Data1[i]);
}
VariantClear(&v);
delete [] Data1;
}