VARIANT 到 QString的转换

本文介绍了在处理VARIANT的SAFEARRAY字段时遇到的问题及绕过方法,详细讲解了QString与其他字符串类型(如char *、BSTR、LPCSTR、LPCWSTR、CString等)之间的转换,包括使用toLatin1、toStdString、toUtf16等函数,并讨论了Unicode和ANSI编码在不同字符集下的表现和注意事项。
摘要由CSDN通过智能技术生成

补-----

最近使用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-----------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值