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

  • 相关阅读:
    期权波动率模型及交易策略分析
    k阶原点距和k阶中心距各是说明什么数字特征
    在Linux中监视IO性能
    NUMA微架构
    Web网站的几个QPS
    Elasticsearch与Solr 选型
    相关连接(后续更新)
    linux_基本命令使用(后续更新)
    centos7.5安装kafka(支持外部连接)
    centos7.5单机安装安装zookeeper
  • 原文地址:https://www.cnblogs.com/bemawen/p/3229725.html
Copyright © 2011-2022 走看看