RegSetValueEx返回成功,但是注册表值未在regedit中更新

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RegSetValueEx返回成功,但是注册表值未在regedit中更新相关的知识,希望对你有一定的参考价值。

我读过很多文章,但似乎都不适用于我遇到的问题。

首先,我继承了当前的注册表值,因此我被迫使用KEY_WOW64_32KEY。 (将64位应用程序写入32位注册表)

这是我在C ++代码中遇到的问题:如果我设置注册表值(使用下面的代码),然后获取注册表值(使用下面的代码),它似乎可以正常工作(我的'get'等于我的“设置”。

但是当我打开regedit(32位版本)时,该值未得到更新。我什至检查了regedit(64位版本),并且该值甚至不存在(按预期)。

感谢第一响应者-我已将这些建议纳入其中并发布了重写内容;为了调试,我放入了一些硬编码的值(在调用RegSetValueEx之前)。一旦我弄清楚,这些将被删除。

请注意,所有这些代码都很好地执行,并返回ERROR_SUCCESS。

所以,仅重申我的问题:为什么regedit不使用RegSetValueEx使用的值更新?

BTW-我玩过RegFlushKey,但没什么区别。另外,我正在使用UNICODE进行编译。我想念什么?

/************************************************************************************
************************************************************************************/
LRESULT PWRegistry::SetValue(HKEY hKey, const std::wstring& sSubKey, const std::wstring& sName, const std::wstring& sValue)
{
    //  Init locals
    HKEY hRegKey(nullptr);
    DWORD dwAccess(KEY_WRITE | KEY_WOW64_32KEY);    //  Set in the 32-bit registry
    LRESULT result(ERROR_SUCCESS);
    DWORD dwSize = (DWORD)((sValue.length() + 1) * sizeof(wchar_t));

    //  Open the key
    result = RegOpenKeyEx(hKey, sSubKey.c_str(), 0, dwAccess, &hRegKey);
    if (result != ERROR_SUCCESS)
    {
        //  Create it
        if (ERROR_SUCCESS != RegCreateKey(hKey, sSubKey.c_str(), &hRegKey))
        {
            return result;
        }
    }

    //  Hardcode some values during debugging
    TCHAR tcName[] = L"APP_ABBR";
    TCHAR tcValue[] = L"TLM";
    dwSize = (DWORD)((lstrlen(tcValue) + 1) * sizeof(TCHAR)); // This equals 8

    //  Set the value
    result = RegSetValueEx(hRegKey, tcName, 0, REG_SZ, (BYTE*)tcValue, dwSize);

    if (hRegKey!= nullptr)
    {
        RegCloseKey(hRegKey);
    }

    return result;
}

/************************************************************************************
************************************************************************************/
LRESULT PWRegistry::GetValue(HKEY hKey, LPCTSTR lpszSubKey, LPCTSTR lpszValueName, DWORD dwType, LPBYTE pData, DWORD dwDataSize)
{
    DWORD dwOptions(0);
    DWORD dwAccess(KEY_QUERY_VALUE | KEY_WOW64_32KEY);  //  Get from the 32-bit registry

    HKEY hRegKey(nullptr);
    LRESULT result = RegOpenKeyEx(hKey, lpszSubKey, dwOptions, dwAccess, &hRegKey);

    if (result == ERROR_SUCCESS)
    {
        result = RegQueryValueEx(hRegKey, lpszValueName, NULL, &dwType, (LPBYTE)pData, &dwDataSize);
    }

    if (hRegKey != NULL)
    {
        RegCloseKey(hRegKey);
    }

    return result;
}

答案

这很令人尴尬-但以防万一其他人访问此空间或遇到类似问题-归结为飞行员错误。

所传递的子键名称(sSubKey)在应有的位置上方'1-level'。因此,当我检查regedit时,我没有在预期的位置看到它们-然后我终于注意到它们位于1级以上。 h!

当我传递正确的sSubKey时,以上功能按预期工作。

以上是关于RegSetValueEx返回成功,但是注册表值未在regedit中更新的主要内容,如果未能解决你的问题,请参考以下文章

RegSetValueEx - 路径错误,64 位,以管理员身份运行

RegCreateKeyEx 和 RegOpenKeyEx 成功但 RegSetValueEx 无法设置值

Windows API一日一练 64 RegSetValueEx和RegDeleteValue函数

06 finally 中调整返回对象, 但是最终返回值未改变

06 finally 中调整返回对象, 但是最终返回值未改变

06 finally 中调整返回对象, 但是最终返回值未改变