RegSetValueEx возвращает успех, но значения реестра не обновляются в regedit - PullRequest
0 голосов
/ 11 января 2020

Я прочитал множество сообщений, но ни одна из них, похоже, не относится к проблеме, с которой я столкнулся.

Во-первых, я унаследовал текущие значения реестра, поэтому я вынужден использовать KEY_WOW64_32KEY. (Запись 64-битного приложения в 32-битный реестр)

Вот что я испытываю из своего кода C ++: если я установлю значение реестра (с кодом ниже), а затем получу значение реестра (с кодом ниже), он, кажется, работает нормально (мой 'get' равен моему 'set').

Но когда я открываю regedit (32-битная версия), значение не обновляется. Я даже проверил regedit (64-битная версия), и значение даже не там (как и ожидалось).

Спасибо первому ответчику - я включил эти предложения и опубликовал переписывание; и ради отладки я вставил некоторые жестко закодированные значения (непосредственно перед вызовом RegSetValueEx). Они будут удалены, как только я это выясню.

Обратите внимание, что весь этот код выполняется просто отлично и возвращает ERROR_SUCCESS.

Итак, просто чтобы повторить мой вопрос: почему regedit не обновляется со значениями используется моим RegSetValueEx?

Кстати - я играл с 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;
}

1 Ответ

0 голосов
/ 14 января 2020

Что ж, это неловко - но на тот случай, если кто-то еще посетит это пространство или столкнется с подобной проблемой - это привело к ошибке пилота.

Переданное имя подключа (sSubKey) было '1- уровень "выше, чем это должно было быть. Следовательно, когда я исследовал regedit, я не видел их в ожидаемом месте - и затем я наконец заметил их на 1 уровень выше. Doh!

Когда я передал правильный sSubKey, вышеупомянутые функции работали как ожидалось.

...