补-----
最近使用VARIANT的SAFEARRAY字段parray,发现SafeArrayGetElement获取不到数据,可是调试器却可以看到数组里面的数据。
急于出代码,就找了另一个途径获取了。
typedef struct tagSAFEARRAY
{
USHORT cDims; //数组维数
USHORT fFeatures;
ULONG cbElements;
ULONG cLocks;
PVOID pvData; //这个是数组首地址
SAFEARRAYBOUND rgsabound[ 1 ];// length信息
} SAFEARRAY;
VARIANT v;
long len=v.parray->rgsabound[0].cElements;
((VARIANT*)v.parray->pvData)[index];
SAFEARRAY访问方法:
(1) 直接读取缓冲区
SAFEARRAY * psa;
//读取
BYTE *buf;
SafeArrayAccessData(psa, (void **)&buf); //安全指针
SafeArrayUnaccessData(psa); //关闭后仍然可读取数据,但不能写入
//写入
BYTE *buf;
SafeArrayAccessData(psa, (void **)&buf); //安全指针
for(int i=0;i<len;i++)
buf[i]=(i+2)%256; // 直接修改缓冲区<="" p="">
SafeArrayUnaccessData(psa);
2) 利用函数单个读取(SafeArrayGetElement,SafeArrayPutElement)
long len=psa->rgsabound[0].cElements;
BYTE *pData=new BYTE[len];
for (int i=0;i<len;i++)< p="">
{
::SafeArrayGetElement(psa,&i,pData+i)
}
//写入
long len=psa->rgsabound[0].cElements;
for (int i=0;i<len;i++)
{
::SafeArrayPutElement(psa,&i,pData[i]);
}
--------2015-----------