COM:将不同数据类型打包为VARIANT

1、std::vector<CString>& vtDocs

打包:

CComBSTR bstrVal;
CComSafeArray<BSTR> bstrArray;
for (int i = 0; i != vtDocs.size(); i++)
{
	bstrVal = vtDocs[i];
	bstrArray.Add(bstrVal);
}

VARIANT varVal;
V_VT(&varVal) = VT_BSTR | VT_ARRAY;
V_ARRAY(&varVal) = bstrArray;
bstrArray.Detach();

解包:

VARIANT* pVarDocs, StringArray& docs

CComSafeArray<BSTR> bstrArray;
ULONG uSize = 0;
if (pVarDocs->vt != VT_EMPTY)
{
<span style="white-space:pre">	</span>bstrArray.Attach(pVarDocs->parray);
	uSize = bstrArray.GetCount();
	for (ULONG u = 0; u < uSize; u++)
	{
		_bstr_t bstrVal = bstrArray.GetAt(u);
		String strVal = bstrVal;
		docs.push_back(strVal);
	}

	bstrArray.Detach();
}


2、结构体数组 UserInfoArray& userArray

打包:

if ( userArray.size() <= 0 ){
	break;
}

	// @desc :
	HRESULT Hr;
	CComPtr<IRecordInfo> spRecordInfo;
	size_t nSize = userArray.size();
	Hr = ::GetRecordInfoFromGuids(LIBID_VT_CommutiLib, 1, 0, LOCALE_USER_DEFAULT, __uuidof(TUserInfo), &spRecordInfo);
	ASSERT( SUCCEEDED(Hr) );
	if( S_OK != Hr ){
		break;
	}

	__pUserListSA = ::SafeArrayCreateVectorEx(VT_RECORD, 0, nSize, (void*)spRecordInfo);
	ASSERT( __pUserListSA );
	if ( !__pUserListSA ){
		break;
	}

	TUserInfo* pData = NULL;
	Hr = ::SafeArrayAccessData( __pUserListSA, (void**)&pData );
	ASSERT( SUCCEEDED(Hr) );
	if( S_OK != Hr ){
		break;
	}
	ASSERT( pData );
	if ( !pData ){
		break;
	}

	//打包用户到安全数组
	for( size_t i = 0; i < nSize; ++i )
	{
		pData[i].nUserId = userArray[i].id;							
		pData[i].bstrNickName = UnitoBSTR( userArray[i].nickName );			
		pData[i].byteUserRole = userArray[i].role;					
		pData[i].byteSpeekState = userArray[i].speekState;				
		pData[i].byteControlState = userArray[i].controlState;
	}

	::SafeArrayUnaccessData( __pUserListSA );
<span style="white-space:pre">	VARIANT varVal;
<span style="white-space:pre">	</span>VariantInit( &varVal );
<span style="white-space:pre">	</span>if ( __pUserListSA )
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>varVal.vt = VT_ARRAY | VT_RECORD | VT_PTR;
<span style="white-space:pre">		</span>varVal.parray = __pUserListSA;
<span style="white-space:pre">	</span>}</span>
<span style="white-space:pre">	// @desc : 释放节点
<span style="white-space:pre">	</span>if ( __pUserListSA )
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>// @desc : 释放安全数组
<span style="white-space:pre">		</span>SafeArrayDestroy( __pUserListSA );
<span style="white-space:pre">		</span>__pUserListSA = NULL;
<span style="white-space:pre">	</span>}</span>

解包:

VARIANT* pArray = (VARIANT*)wParam;
CSafeArrayWarper arrConf;
arrConf.Attach(pArray->parray);
CString sVal;
LONG nMaxSize = arrConf.GetCount();
if (nMaxSize)
{
	TVTRoomAvailable* pData = NULL;
	TVTRoomAvailable* pEle = NULL;
	HRESULT hr = arrConf.AccessData((void**)&pData);
	ASSERT(SUCCEEDED(hr));
	for (LONG i = arrConf.GetLowerBound(); i < nMaxSize; i++)
	{
		pEle = &pData[i];
		SM_MEETINGINFO* pInfo = new SM_MEETINGINFO;
		if (pInfo)
		{
			_stprintf_s(pInfo->szConfName, _countof(pInfo->szConfName), _T("%s"), pEle->bstrConfName);
			pInfo->nConfID = pEle->nConfID;
			pInfo->wMaxCount = pEle->nMaxCount;
			pInfo->wCurCount = pEle->nCurCount;

			m_vecMeetingInfo.push_back(pInfo);
		}
	}

	arrConf.UnAccessData();
}
arrConf.Detach();



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值