向注册表写入中文,在一台机器运行正常,使用RegSetValueExA 及 RegSetValueExW均正常。在另一台机器上,RegSetValueExA 及 RegSetValueExW,都出现乱码,这是怎么回事,哪位大神帮忙解答一下bool   SetRegValue(HKEY root, const LPCSTR regPath, const LPCSTR name, const string strReadRes, DWORD dwAccess)
{
HKEY hKey;
WCHAR szLocation[MAX_PATH] = { 0 };
DWORD dwSize = sizeof(DWORD);
DWORD dwType = REG_SZ;
LONG ret; ret = RegOpenKeyExA(root, regPath, 0, dwAccess, &hKey);
DWORD len = strReadRes.size(); if (ret == ERROR_SUCCESS) {
if (ERROR_SUCCESS == RegSetValueExA(hKey, name, 0, REG_SZ, (CONST BYTE*)strReadRes.c_str(), len + 1)) {
RegCloseKey(hKey);
return true;
}
}
RegCloseKey(hKey);
return false;
}bool   SetRegValueW(HKEY root, LPCWSTR regPath, LPCWSTR name, const wstring wstrReadRes, DWORD dwAccess)
{
HKEY hKey;
WCHAR szLocation[MAX_PATH] = { 0 };
DWORD dwSize = sizeof(DWORD);
DWORD dwType = REG_SZ;
LONG ret; ret = RegOpenKeyExW(root, regPath, 0, dwAccess, &hKey);
DWORD len = wstrReadRes.size() * 2; if (ret == ERROR_SUCCESS) {
if (ERROR_SUCCESS == RegSetValueEx(hKey, name, 0, REG_SZ, (CONST BYTE*)wstrReadRes.c_str(), len + 1)) {
RegCloseKey(hKey);
return true;
}
}
RegCloseKey(hKey);
return false;
}

解决方案 »

  1.   

    读注册表:
    bool CRegedit::ReadRegValueW(HKEY root, LPCWSTR regPath, LPCWSTR name, wstring& strReadRes, DWORD dwAccess)
    {
    HKEY hKey;
    WCHAR szLocation[MAX_PATH] = { 0 };
    DWORD dwSize = sizeof(DWORD);
    DWORD dwType = REG_SZ;
    LONG ret; ret = RegOpenKeyEx(root, regPath, 0, dwAccess, &hKey);
    if (ret == ERROR_SUCCESS) {
    RegQueryValueEx(hKey, name, 0, &dwType, NULL, &dwSize);
    ret = RegQueryValueEx(hKey, name, 0, &dwType, (LPBYTE)&szLocation, &dwSize);
    if (ret == ERROR_SUCCESS) {
    strReadRes = std::wstring(szLocation);
    RegCloseKey(hKey);
    return true;
    }
    }
    RegCloseKey(hKey);
    return false;
    }
    bool CRegedit::ReadRegValue(HKEY root, LPCSTR regPath, LPCSTR name, string& strReadRes, DWORD dwAccess)
    {
    HKEY hKey;
    WCHAR szLocation[MAX_PATH] = { 0 };
    DWORD dwSize = sizeof(DWORD);
    DWORD dwType = REG_SZ;
    LONG ret; ret = RegOpenKeyExA(root, regPath, 0, dwAccess, &hKey);
    if (ret == ERROR_SUCCESS) {
    RegQueryValueExA(hKey, name, 0, &dwType, NULL, &dwSize);
    ret = RegQueryValueExA(hKey, name, 0, &dwType, (LPBYTE)&szLocation, &dwSize);
    if (ret == ERROR_SUCCESS) {
    strReadRes = WStringToString(szLocation);
    RegCloseKey(hKey);
    return true;
    }
    }
    RegCloseKey(hKey);
    return false;
    }
      

  2.   

    我写的时候是是格式化的字符串(英文冒号作为分隔符):软件名+英文冒号+整数+冒号+整数,(在一台机器上)写入这册表是乱码,同时使用ReadRegValueW读取时,有的汉字可以读取,有的汉字不能读取。比如“IE浏览器:2345:10",器字读不出来,冒号也读不到。但是"爱奇艺影音:2345:10",汉字和冒号都能读出来(即使查看注册表是乱码)。 哪位对字符编码比较精通的帮忙解答一下?
      

  3.   

    个人估计是出现在码转换上
    strReadRes = std::wstring(szLocation);
    strReadRes = WStringToString(szLocation);建议 写的时候UNICODE 转换成UTF8,  读的时候UTF8转到UNICODE