gpt4 book ai didi

c++ - 注册表设置为1个字符

转载 作者:行者123 更新时间:2023-12-02 10:21:58 25 4
gpt4 key购买 nike

我的代码正在设置注册表名称和值的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()(其中valueNamestd::wstring)。
LPCSTR const char * ,而 wstring::c_str() 返回 const wchar_t *

因此,L"ServiceType"被视为"S\0e\0r\0v\0i\0c\0e\0T\0y\0p\0e\0",它变成了"S"
有两种可能的解决方案:

  • 使用std::string而不是std::wstring(并从类似L的字符串中删除L"ServiceType")。不建议使用此解决方案,因为Win32 API内部是Unicode。
  • 将项目设置从(多字节)更改为 Unicode字符集,并将强制类型转换为LPCSTR(如果确实需要强制类型转换,请改用LPTSTR,它始终与项目字符集设置匹配)。

  • 有关更多详细信息,请参见 Working with Strings - Win32 API

    关于c++ - 注册表设置为1个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59775997/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com