VARIANT中存取数组,本例以BYTE数组为例

//
// 作者:童方
// 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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值