3

我在以下代码中使用 RegSetValueEX 并将值设置为难以理解的字符(中文外观)。我在猜测整个美丽的编码世界?

HKEY regKey;
std::string newIP = "192.168.1.2";

Result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Comm\\VMINI1\\Parms\\TcpIp"), 0, 0, &regKey);
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 地址未设置为提供的值,它是随机字符。可能是什么问题呢?

4

2 回答 2

5

std::string仅使用char。大多数 Win32 API 函数,包括RegOpenKeyEx()and RegSetValueEx(),都TCHAR改为使用(正如您对TEXT()宏的使用所表明的那样)。 TCHAR映射到charwchar_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::wstringRegSetValueExW()而不是:

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));
于 2013-05-22T17:25:30.823 回答
3

您使用std::string的是 ANSI,但您可能正在使用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, &regKey);
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!";
    }
}
于 2013-05-22T17:24:01.090 回答