RegSetValueEx函数编写乱码

时间:2013-05-22 17:11:59

标签: c++ winapi registry windows-ce

我在以下代码中使用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地址未设置为提供的值,它是随机字符。可能是什么问题?

2 个答案:

答案 0 :(得分:4)

std::string仅使用char。大多数Win32 API函数(包括RegOpenKeyEx()RegSetValueEx())都使用TCHAR(通过使用TEXT()宏显而易见)。 TCHAR映射到charwchar_tRegSetValueEx()映射到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));

答案 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, &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!";
    }
}