描述:
我做的一个variant 中是一个一维的safearray,bstr类型,在一个函数中赋值代码如下:for (long l= aDim[0].lLbound; l< (long)(aDim[0].cElements + aDim[0].lLbound); l++) {
CspTextLength = cspGetBarcode(szCspText, l, sizeof(szCspText));
VARIANT vOut;
VariantInit(&vOut);
vOut.vt= VT_BSTR;
BSTR b=_com_util::ConvertStringToBSTR(szCspText);
vOut.bstrVal=::SysAllocString(b);
aLong[0]= l; // set index value
if (hr= SafeArrayPutElement(pSA, aLong, &vOut))
{
VariantClear(&vOut); // release BSTR from memory on error
SafeArrayDestroy(pSA); // does a deep destroy on error
// return hr;
}
VariantClear(&vOut); // does a deep destroy of source VARIANT
} // end iteration
value.parray=pSA;
value.vt = VT_ARRAY|VT_BSTR;
然后此函数返回value,
在另一个函数读数据,参数就是上面函数的返回值,代码如下:
BSTR pvData ;
VARIANT* temp1=0;
HRESULT hr;
char *p=0;
hr=::SafeArrayAccessData(value.parray, (void **)&temp1);
pvData=temp1[2].bstrVal;
p=_com_util::ConvertBSTRToString(pvData);
在hr=::SafeArrayAccessData(value.parray, (void **)&temp1);这句中,好像Value.parray有问题,不能正确取出数据,在执行pvData=temp1[2].bstrVal时,系统报错,然后退出,我猜是value中的数组有问题,好像内存已经释放了,请高手帮忙指导,在线等。急,,,,,,谢谢,
解决方案1:
value.parray=pSA;
value.vt = VT_ARRAY|VT_BSTR;
为什么要加VT_BSTR?value也不知道你的array里是bast
如果你加了这个返回的时候会作为bstr来处理,而不是array pointer
或者返回值改为SAFEARRAY
if (hr= SafeArrayPutElement(pSA, aLong, &vOut)) //看看这块的hr的值
{
VariantClear(&vOut); // release BSTR from memory on error
SafeArrayDestroy(pSA); // does a deep destroy on error
// return hr;
}
还有这里不用这样:
BSTR pvData ;
VARIANT* temp1=0;
HRESULT hr;
char *p=0;
hr=::SafeArrayAccessData(value.parray, (void **)&temp1);
pvData=temp1[2].bstrVal;
p=_com_util::ConvertBSTRToString(pvData);
直接:
BSTR *pvData ;
HRESULT hr;
char *p=0;
hr=::SafeArrayAccessData(value.parray, (void **)&pvData );//最好跟一下看看value.parray里面有值没有?
p=_com_util::ConvertBSTRToString(pvData[2]);
第一:你可以检查赋值是否成功,每个函数的返回值都要检查.第二,SAFEARRAY中可以直接存BSTR,你为何又要加一层VARIANT(即varout),第三,访问时hr有问题,数据当然取不出来!其他问题暂时看不出来,要不你发(最小代码:赋值与调用两个函数加一个主函数)给我,我来调试:liuchanghua0010@hotmail.com
解决方案4:我帮你抗。我接触这个东西不多。value.parray=pSA;这么写法是不是不太对劲?这个pSA从哪里来的?