使用RegSetValueExA 及 RegSetValueExW写这册表(中文)均出现乱码

jixiang1983 2019-03-18 10:40:51
向注册表写入中文,在一台机器运行正常,使用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;
}
...全文
716 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixiang1983 2019-03-19
  • 打赏
  • 举报
回复
怎么没人回复,自己顶一下
zgl7903 2019-03-19
  • 打赏
  • 举报
回复
个人估计是出现在码转换上
strReadRes = std::wstring(szLocation);
strReadRes = WStringToString(szLocation);

建议 写的时候UNICODE 转换成UTF8, 读的时候UTF8转到UNICODE

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

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧