我知道SafeArray。我之所以这样写是因为看到了书上的例子。而且,既然存在size_is这样的idl关键字,为什么还要我用SafeArray呢?SafeArray里面有bound信息,那么size_is岂不是多次一举呢?
非常困惑中,请解惑!
非常困惑中,请解惑!
解决方案 »
- 怎么判断游戏手柄的上下左右键被按下
- 怎么去掉VS2010变量函数下面的红色波浪下划线?
- dll文件加了Themida的壳之后在Windows XP英文版系
- 关于邮件外发审核控制的技术实现,求教这方面的高手~~
- 关于拖动程序的问题
- 我想问一下windows里面用ctrl+c,ctrl+v的时候调用那个系统api?
- 怎么在VC6.0(7.0)IDE中建立一个WinMain()启动窗口的c程序工程?
- vc忽略了异常规范,能让他不忽略吗?
- 关于#define UNICODE,STARTUPINFO?
- 难度系数10.0,很有挑战性,有关动态执行Click事件的问题!!!!!!!!
- 为什么我的OnPaint函数里没有擦去以前的背景
- 我用vc2012写的win32程序为何放在别的电脑上提示要许多dll,如何设置,不需要加载这些dll。
COM 中的数组是以SafeArray 类型来表示
下面是对数组的操作
bool CXXX::GetSafeArray(_variant_t& var, vector<string>& vecArray)
{
if( false == (var.vt & VT_ARRAY) )
{
return false;
} ULONG len = var.parray->rgsabound[0].cElements;
VARIANT * pv =(_variant_t*)var.parray->pvData; for( int i = 0; i < len; i++ )
{
vecArray.push_back(string(_com_util::ConvertBSTRToString(pv[i].bstrVal)));
} return true;
}bool CIISAdmin::SetSafeArray(IADs *pSite, string strArrayName, vector<string> vecArray)
{ if( !pSite || strArrayName.length() == 0)
{
return false;
} SAFEARRAY* pSA;
SAFEARRAYBOUND aDim[1];
aDim[0].lLbound = 0;
aDim[0].cElements = vecArray.size(); pSA = SafeArrayCreate(VT_VARIANT,1,aDim); for(long l = 0; l < vecArray.size(); l++)
{
VARIANT vtTmp = _variant_t(vecArray[l].c_str());
if(S_OK != SafeArrayPutElement(pSA,&l,&vtTmp))
{
break;
}
}
_variant_t vt;
VariantInit(&vt);
BSTR pArrayName = _com_util::ConvertStringToBSTR(strArrayName.c_str()); _variant_t var;
pSite->Get(pArrayName,&var);
V_VT(&vt) = var.vt;//vt.vt | VT_ARRAY;
V_ARRAY(&vt) = pSA;
HRESULT hRet = pSite->Put(pArrayName, vt);
SysFreeString(pArrayName); pSite->SetInfo();
//SafeArrayDestroy(pSA);
//SafeArrayUnaccessData(pSA);
VariantClear(&vt); return true;
}