zoukankan      html  css  js  c++  java
  • 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]='';

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

        delete []buf;

    ,把宽字节变回unicode编码。

  • 相关阅读:
    Linux 查看端口占用情况
    Linux 的 ls 和 ll 的使用方法:
    awk文本分析
    【Linux】/etc/passwd文件中字段解释
    vue学习笔记(八)---源码学习
    uniapp学习笔记(更新中)
    微信小程序学习
    哈希表的原理
    容器通常具备一些固定的方法
    字符串的方法
  • 原文地址:https://www.cnblogs.com/bemawen/p/3229725.html
Copyright © 2011-2022 走看看