Emi*_*ags 4 c++ windows registry winapi stl
我有一个获取std :: string的函数.那个函数调用
第五个参数是注册表值的值,并期望一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我首先创建一个宽字符串(定义了UNICODE),然后使用双重转换,并且对于长度我必须做*2,否则它只会设置输入字符串的一半.
这种形式的演员是正常/最好的方式吗?
为什么*2,会有什么更好的方法?
Ida*_*n K 10
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我删除了将字符串转换为wstring的部分,而不是显式使用ANSI版本的RegSetValueEx.
引用来自MSDN中的RegSetValueEx备注:
如果dwType是REG_SZ,REG_MULTI_SZ或REG_EXPAND_SZ类型并且使用此函数的ANSI版本(通过显式调用RegSetValueExA或在包含Windows.h文件之前未定义UNICODE),则lpData参数指向的数据必须为ANSI字符串.在将字符串存储在注册表中之前,该字符串将转换为Unicode.
另请注意,cbData参数应包括空终止的大小.