Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ RegSetValueEx函数写入乱码_C++_Winapi_Registry_Windows Ce - Fatal编程技术网

C++ 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, &regKey); if (Result == ERROR_SUCCESS) { Resul

我在下面的代码中使用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!";
    }
}
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::cout
std::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));