【问题标题】:RegSetValueEx function writing gibberishRegSetValueEx 函数编写乱码
【发布时间】:2013-05-22 17:11:59
【问题描述】:

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

【问题讨论】:

    标签: c++ winapi registry windows-ce


    【解决方案1】:

    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));
    

    【讨论】:

    • 我使用 std::wstring 因为 Windows CE 7 没有 RegSetValueExA 可用。这很好用,当整个 ASCII 和 UNICODE 问题出现时,我的思绪开始颤抖。
    【解决方案2】:

    您使用的是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!";
        }
    }
    

    【讨论】:

    • 如果未定义 UNICODE,此代码将失败。您使用std::wstring 明确了字符串字符类型,因此在调用Win API 时您也应该明确:RegOpenKeyExWRegSetValueExWTEXT 宏应替换为宽字符前缀,例如。 G。 L"192.168.1.2".
    猜你喜欢
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 2012-07-18
    • 1970-01-01
    • 2012-04-13
    相关资源
    最近更新 更多