我有一个获取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/

10-12 06:07