Unicode编码下用RegQueryValueEx和RegSetValueEx读写注册表乱码问题

最近做一个小工具需要向注册表写入一个路径,发现写入注册会乱码,读取如果带中文也读到乱码。经过半天时间的研究,发现原来是unicode编码的问题。

原先用这种方式把CString转成LPBYTE类型

LPBYTE lpData = new BYTE[str.GetLength()+1];

int i = 0;

for(; i < str.GetLength(); i++) { 

*(lpData+i) = str.GetAt(i);

}

RegSetValueEx(hProductKey,"FilePath",0,REG_SZ,lpData ,len);

,因为unicode编码下直接转成LPBYTE结果只剩第一个字符。也就是说把unicode编码转成ANSI编码就能正确转换了,所以代码改为如下:

int wlen=wcslen(str)*2;

char *pElementText = new char[wlen];

WideCharToMultiByte(CP_ACP,NULL,str,-1,pElementText,wlen+2,NULL,NULL);

RegSetValueExA(hProductKey,"FilePath",0,REG_SZ,(unsigned char*)pElementText,wlen);

成功正却写入带中文的路径键值。

 

但是读取到含中文的键值还是乱码,所以读取后做了如下操作:

CString str = _T("");

LPBYTE lpData = new BYTE[256]; 

DWORD cbData = 256; 

DWORD dwType = REG_SZ; 

if(RegQueryValueExA(hProductKey,"FilePath", 0, &dwType, lpData, &cbData) == ERROR_SUCCESS){ 

int ichrLen=strlen((char*)lpData);

    int iLen=MultiByteToWideChar(CP_ACP,0,(char*)lpData,ichrLen,NULL,0);

    TCHAR* buf=new TCHAR[iLen+1];

    MultiByteToWideChar(CP_ACP,0,(char*)lpData,ichrLen,buf,iLen);

    buf[iLen]='\0';

    str.Format(_T("%s"),buf);

    delete []buf;

,把宽字节变回unicode编码。

转载于:https://www.cnblogs.com/bemawen/p/3229725.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值