RegSetValueEx函数写乱码

d d*_*d d 3 c++ registry winapi 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!";
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,当我查看注册表项时,IP 地址并未设置为提供的值,而是随机字符。可能是什么问题呢?

Rem*_*eau 5

std::stringchar仅使用。大多数 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);
Run Code Online (Sandbox Code Playgroud)

否则,请更改您的代码以使用std::wstringandRegSetValueExW()代替:

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));
Run Code Online (Sandbox Code Playgroud)