注册表正在设置 1 个字符
Registry is setting 1 char
我的代码正在设置注册表名称和值的 1 个字符。
bool setRegValue(std::wstring valueName, std::wstring valueToSet)
{
HKEY key=NULL;
if (get_HKEY_LOCAL_MACHINE(&key) && (key!=NULL))
{
if (RegSetValueEx((HKEY)key, (LPCSTR)valueName.c_str(), 0, REG_SZ, (const BYTE*)valueToSet.c_str(), (valueToSet.size() +1)*sizeof(wchar_t)) != ERROR_SUCCESS)
{
RegCloseKey((HKEY)key);
log.error("Failed to SET the registry value. Name : "+ std::string(valueName.begin(), valueName.end())+" Value : "+ std::string(valueToSet.begin(), valueToSet.end()));
RegCloseKey(key);
return false;
}
log.info("Successfully SET the registry value. Name : " + std::string(valueName.begin(), valueName.end()) + " Value : " + std::string(valueToSet.begin(), valueToSet.end()));
RegCloseKey(key);
return true;
}
return false;
}
而且,这是调用方法。
bool setServiceAsClient()
{
if (setRegValue(L"ServiceType", L"Client"))
return true;
return false;
}
它将注册表名称设置为S
而且,价值为C
当宽字符字符串被视为 1 个字符字符串时,这是一种症状,即您提供的宽字符字符串需要多字节字符串。
事实上,我们在这里看到了错误:(LPCSTR)valueName.c_str()
(其中valueName
是std::wstring
(。
LPCSTR
是const char *
,而wstring::c_str()
返回const wchar_t *
。
所以L"ServiceType"
被视为"S e r v i c e T y p e "
,这变得简单"S"
有两种可能的解决方案:
- 使用
std::string
而不是std::wstring
(并从字符串中删除L
,如L"ServiceType"
(。不建议使用此解决方案,因为 Win32 API 内部是 Unicode。 - 将项目设置从">多字节"更改为"Unicode字符集",并删除要
LPCSTR
的强制转换(如果确实需要强制转换,请改用LPTSTR
,它始终与项目字符集设置匹配(。
有关更多详细信息,请参阅使用字符串 - Win32 API。
相关文章:
- 提升区域设置规范化带状字符,但不规范化重音
- 将十六进制值设置为用于填充的字符变量时出现问题
- 注册表正在设置 1 个字符
- 是否有任何区域设置会影响宽字符编码?
- 我如何处理有关输入的字符串大小超过字符数组设置大小的错误?
- 以字符为单位设置控制台大小
- 将终端设置为原始模式:仅在按下下一个键后显示字符
- 将字符数组设置为彼此相等的方法不起作用
- 在无符号字符数组中设置无符号短字符
- 通过比较字符设置字符串时出现问题
- 无法使用 Unicode 特殊字符设置窗口文本
- 使用无符号字符设置文本格式
- 有没有办法为 TAB 字符(反斜杠 t)"t"设置特定数量的最大空格数C++?
- 如何将单个字符转换为为基本密码哈希器设置整数,C++
- 是否将常量字符*设置为等于字符[]文字安全
- 如何将字符设置为函数?我对语法感到困惑...设置<char>max_freq(映射<字符,整数>频率)
- 我如何将特定字符设置为多维数组中的不同颜色
- 将等于369的字符设置为与113相同的二进制图案是UB行为
- 提升shared_array<char>并从字符* 设置它
- C++程序检查 IBAN 帐号 - 如何为每个字符设置值:A=>10、B=>11、C=>12