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编码。

posted @ 2013-08-01 12:28  弼码温  阅读(3312)  评论(0)    收藏  举报