C++ 注册表正在设置1个字符
我的代码设置了注册表名和值的1个字符C++ 注册表正在设置1个字符,c++,windows,registry,C++,Windows,Registry,我的代码设置了注册表名和值的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_
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
是常量字符*
,而返回常量字符*
因此L“ServiceType”
被视为“S\0e\0r\0v\0i\0c\0e\0T\0y\0p\0e\0”
,它变成了“S”
有两种可能的解决方案:
std::string
代替std::wstring
(并从L“ServiceType”
等字符串中删除L
)。不建议使用此解决方案,因为Win32 API内部是UnicodeLPCSTR
(如果确实需要强制转换,请改用始终与项目字符集设置匹配的LPTSTR
)有关详细信息,请参阅。您的问题是什么?它不起作用吗?它以什么方式不起作用?您是否收到错误消息和/或错误代码?我们是否应该为该答案找到正确的问题?什么是
get\u HKEY\u LOCAL\u MACHINE
?RegSetValueEx
的键
应该是打开的注册表项的句柄,通常类似于HKLM\SOFTWARE\[Company]\blahblahblah
函数名意味着它是HKLM
本身。。。复制并粘贴,这是我使用的(不是Unicode,所以使用A
version)val=RegSetValueEx(hKey,strValueName.c_str(),0,REG_SZ,(BYTE*)strValue.c_str(),(DWORD)strValue.size()+1)代码>您的代码看起来基本相同,但针对Unicode进行了修改,因此没有看到任何偏离顶部的内容。基本原因与。演员们总是疑神疑鬼。我怀疑您收到了关于类型不匹配的编译器警告,但您没有解决不匹配问题,而是使用了强制转换来表示“相信我”。第三个常用的选项是直接使用宽字符或多字节函数名(例如,RegSetValueExW
和RegSetValueExA
),忘记TCHAR
宏。一个程序不太可能以独立的宽字符和多字节版本分发。选择是由所需的库和跨平台需求确定的。在Windows 10中,多字节API可以是Unicode(UTF-8),但有些函数仍然只有宽字符API,既有“W”后缀(例如GetVolumeInformation ByHandlew
),也没有后缀(例如GetFileInformationByHandleEx
)。完美。感谢@rustyx的详细解释