描述:
有一个SAFEARRAY* saf1,
含有10000个short型整数,
如何快速而且高效率的得到前1000个short
并且用前1000个short生成一个新的SAFEARRAY* saf2,
我要做很多次这个操作,所以希望有一种高效率的方法,谢谢!
解决方案1:
我以 VT_UI1 | VT_ARRAY 这种类型的 VARIANT 为例,你可以容易改为你想要的:
VARIANT Rec_Data = m_MSComm.GetInput(); //GetInput返回VARIANT类型数据
ASSERT((VT_UI1 | VT_ARRAY) == Rec_Data.vt);
int Data_Len = Rec_Data.parray->rgsabound->cElements; //注意 Data_Len 可能要乘以数据宽度,比如 short 型就要乘以 2
memcpy(CommDataBuff, Rec_Data.parray->pvData, Data_Len); //CommDataBuff 为 BYTE 型数组
下面是一个例子,至于效率,你还想怎样提高?
SAFEARRAY *varSeriesChildren=...;
VARIANT ASeriesChild;
VariantInit(&ASeriesChild);
long lLow=0;
long lHigh=0;
SafeArrayGetLBound(varSeriesChildren,1,&lLow);
SafeArrayGetUBound(varSeriesChildren,1,&lHigh);
for(long ix=lLow;ix<=lHigh;ix++)
{
hr = SafeArrayGetElement(varSeriesChildren, &ix, &ASeriesChild);
if(FAILED(hr))
{
printf("SafeArrayGetElement for child %d failed.\n",ix);
exit(-1);
}
...
}
hr = SafeArrayDestroy(varSeriesChildren);
if(FAILED(hr))
{
printf("SafeArrayDestroyfailed.\n");
}
使用智能指针CComSafeArray<short>可以方便访问元素,但是效率是无法提高的,本质都得依靠SafeArray的API来访问
解决方案4: 直接把你的数据集合封装成COM对象,传递接口而不是数据
和C里面传递数组的引用是一个道理
为什么要用SAFEARRAY,直接用数组不是效率更高?
http://blog.csdn.net/zhoujianhei
博客好像挂了。??
SAFEARRAY 只要顺序访问就行了, 效率最高,因为本质上SAFEARRAY也就是数组,