C++ RegSetValueEx函数写入乱码
我在下面的代码中使用RegSetValueEX,它将值设置为不可理解的字符(看起来像中文)。我猜整个美丽的编码世界有什么变化C++ RegSetValueEx函数写入乱码,c++,winapi,registry,windows-ce,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, ®Key); if (Result == ERROR_SUCCESS) { Resul
HKEY regKey;
std::string newIP = "192.168.1.2";
Result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Comm\\VMINI1\\Parms\\TcpIp"), 0, 0, ®Key);
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!";
}
}
HKEY注册码;
std::string newIP=“192.168.1.2”;
结果=RegOpenKeyEx(HKEY_本地_机器,文本(“Comm\\VMINI1\\Parms\\TcpIp”)、0、0和regKey;
如果(结果==错误\成功)
{
结果=RegSetValueEx(regKey,TEXT(“IPAddress”),0,REG_SZ,(const BYTE*)newIP.c_str(),newIP.size()+1);
如果(结果==错误\成功)
{
std::cout您使用的是ANSI的std::string
,但您可能是使用定义的UNICODE
进行编译。这意味着您将实际调用RegSetValueExW
(UNICODE版本)
HKEY注册码;
std::wstring newIP=TEXT(“192.168.1.2”);//使用宽字符串
结果=RegOpenKeyEx(HKEY_本地_机器,文本(“Comm\\VMINI1\\Parms\\TcpIp”)、0、0和regKey;
如果(结果==错误\成功)
{
结果=RegSetValueEx(regKey,
文本(“IP地址”),
0,
瑞格施,
(常量字节*)newIP.c_str(),
(newIP.size()+1)*sizeof(wchar_t));//注意大小的变化
如果(结果==错误\成功)
{
std::coutstd::string
仅使用char
。大多数Win32 API函数,包括RegOpenKeyEx()
和RegSetValueEx()
,都使用TCHAR
(通过使用TEXT()
宏可以看出).TCHAR
映射到char
或wchar\u t
,RegSetValueEx()
映射到RegSetValueExA()
(Ansi)或regsetvaluexw()
(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::wstring
和RegSetValueExW()
:
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));
因为windows CE 7没有可用的RegSetValueExA,所以我使用了std::wstring。这很好,当整个ASCII和UNICODE问题出现时,我的头脑开始发抖。如果未定义UNICODE
,则此代码将失败。使用std::wstring
,可以明确字符串字符类型,因此也应该明确说明调用Win API时,它将被替换为:RegOpenKeyExW
,regsetvaluexw
。TEXT
宏应替换为宽字符前缀,例如L“192.168.1.2”
。
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));