我读过很多帖子,但似乎没有一个适用于我遇到的问题。
首先,我继承了当前的注册表值,因此我不得不使用 KEY_WOW64_32KEY。(64 位应用程序写入 32 位注册表)
这是我在 C++ 代码中遇到的情况:如果我设置一个注册表值(使用下面的代码)然后获取注册表值(使用下面的代码),它似乎工作正常(我的'get'等于我的'放')。
但是当我打开 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;
}