У меня есть функция, которая получает std :: string. Эта функция вызывает
RegSetValueEx
5-й параметр является значением значения реестра и ожидает переменную типа const BYTE *.
Поэтому мне нужно преобразовать std :: string в const BYTE *, а также указать длину результирующего массива в качестве шестого параметра.
Я нашел способ сделать это, но это ужасно, и я не совсем понимаю, что происходит. Вот уменьшенная версия этой функции:
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, иначе он установит только половину входной строки.
Является ли эта форма приведения нормальным / лучшим способом сделать это?
Почему * 2, что может быть лучше?