我在以下代码中使用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地址未设置为提供的值,它是随机字符。可能是什么问题?
答案 0 :(得分:4)
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));
答案 1 :(得分:3)
您正在使用ANSI std::string
,但您可能正在使用已定义的UNICODE
进行编译。这意味着您RegSetValueEx实际上将调用RegSetValueExW
(unicode版本)。
HKEY regKey;
std::wstring newIP = TEXT("192.168.1.2"); // Use a wide string
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 ) * sizeof( wchar_t ) ); // note the size change
if (Result == ERROR_SUCCESS)
{
std::cout << "Done!";
}
}