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();
}
打包:
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();