我在以下代码中使用了 RegSetValueEX,它将值设置为难以理解的字符(中文外观)。我在猜测整个美丽的编码世界?
HKEY regKey;
std::string newIP = "192.168.1.2";
Result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Comm\\VMINI1\\Parms\\TcpIp"), 0, 0, ®Key);
if (Result == ERROR_SUCCESS)
{
Result = RegSetValueEx(regKey, TEXT("IPAddress"), 0, REG_SZ, (const BYTE*)newIP.c_str(), newIP.size() + 1);
if (Result == ERROR_SUCCESS)
{
std::cout << "Done!";
}
}
然而,当我查看注册表项时,IP 地址未设置为提供的值,它是随机字符。可能是什么问题?
最佳答案
std::string
仅使用 char
。大多数 Win32 API 函数,包括 RegOpenKeyEx()
和 RegSetValueEx()
,都使用 TCHAR
(从您使用 TEXT 可以看出) ()
宏)。 TCHAR
映射到 char
或 wchar_t
,RegSetValueEx()
映射到 RegSetValueExA()
(Ansi) 或 RegSetValueExW()
(Unicode),具体取决于应用程序是否针对 Unicode 进行编译。
在您的情况下,我怀疑该应用程序是针对 Unicode 编译的,因此您的数据与 RegSetValueEx()
所期望的不匹配。
由于您使用的是 char
数据,因此您应该更改代码以直接调用 RegSetValueExA()
,这样就不会出现不匹配:
std::string newIP = "192.168.1.2";
Result = RegSetValueExA(regKey, "IPAddress", 0, REG_SZ, (const BYTE*)newIP.c_str(), newIP.length() + 1);
否则,更改代码以使用 std::wstring
和 RegSetValueExW()
代替:
std::wstring newIP = L"192.168.1.2";
Result = RegSetValueExW(regKey, L"IPAddress", 0, REG_SZ, (const BYTE*)newIP.c_str(), (newIP.length() + 1) * sizeof(wchar_t));
关于c++ - RegSetValueEx 函数写乱码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16697799/