注册表正在设置 1 个字符

Registry is setting 1 char

本文关键字:字符 设置 注册表      更新时间:2023-10-16

我的代码正在设置注册表名称和值的 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(。

LPCSTRconst char *,而wstring::c_str()返回const wchar_t *

所以L"ServiceType"被视为"ServiceType",这变得简单"S"

有两种可能的解决方案:

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

有关更多详细信息,请参阅使用字符串 - Win32 API。