我有一个获取std::string的函数。该函数调用
RegSetValueEx
第 5 个参数是注册表值的值,需要一个类型为 const BYTE* 的变量。
所以我必须将 std::string 转换为 const BYTE* 并将结果数组的长度作为第 6 个参数。
我找到了一种方法来做到这一点,但感觉很难看,我真的不明白发生了什么。这是该功能的精简版:
void function(const std::string& newValue)
{
HKEY keyHandle;
if(RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("some key"),0,KEY_ALL_ACCESS,&keyHandle) == ERROR_SUCCESS)
{
std::wstring wNewValue;
wNewValue.assign(newValue.begin(),newValue.end());
if (RegSetValueEx(keyHandle, TEXT("some value"), NULL, REG_SZ, (const BYTE*)(LPCTSTR)(wNewValue.c_str()), wNewValue.size()*2)==ERROR_SUCCESS)
{
//do something
}
RegCloseKey(keyHandle);
}
}
如您所见,我首先创建一个宽字符串(定义了 UNICODE),然后使用双重转换,对于长度我必须做 *2,否则它只会设置输入字符串的一半。
这种形式的 Actor 是正常/最好的方式吗?
为什么是* 2,什么是更好的方法?
最佳答案
void function(const std::string& newValue)
{
HKEY keyHandle;
if(RegOpenKeyEx(HKEY_CLASSES_ROOT, TEXT("some key"),0,KEY_ALL_ACCESS,&keyHandle) == ERROR_SUCCESS)
{
if (RegSetValueExA(keyHandle, "some value", NULL, REG_SZ, (const BYTE*)newValue.c_str(), newValue.size() + 1)==ERROR_SUCCESS)
{
//do something
}
RegCloseKey(keyHandle);
}
}
我删除了将字符串转换为wstring的部分,取而代之的是您将显式使用ANSI版本的RegSetValueEx。
引用 MSDN 中 RegSetValueEx 的评论:
另请注意, cbData 参数还应包括空终止的大小。
关于c++ - 为 RegSetValueEx() 将 std::string 转换为 const BYTE*,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/849491/