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

来源:互联网 发布:酷狗音乐关闭网络功能 编辑:程序博客网 时间:2024/06/16 20:26
//////////////////////////////////////////////////////////////////////////// 作者:童方// 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;}


 

原创粉丝点击