c++ - RegSetValueEx 函数写乱码

标签 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 地址未设置为提供的值,它是随机字符。可能是什么问题?

最佳答案

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

关于c++ - RegSetValueEx 函数写乱码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16697799/

相关文章:

c# - 什么是vc++中的HWND

c# - x32 和 x64 的公共(public)注册表区域

c++ - 让 GDC 前端发出中间 C/C++ 代码?

c++ - 使用 Winsock 的简单 HTTP 获取

c++ - 在参数列表中使用std::enable_if

c++ - Visual Studio - 调用堆栈不会追溯到用户函数

windows - 当人们在 Windows 上更改时钟时是否有 API 事件?

c++ - InterlockedExchangePointer 是否有裸露的 c++ 11(或 boost)替代品?

c# - 无法从现有键中读取值

c++ - 从 32 位应用程序访问 64 位注册表