c++ - 读取 Windows 注册表时顺序是否重要?

标签 c++ windows registry

似乎顺序对从注册表中读取一些键很重要,这让我感到惊讶。 我通过 Regedit 创建了如下所示的 fake_entry

enter image description here

当我在调用 RegOpenKeyEx() 后立即读取 fake_entry 时,它起作用了。如果我在 fake_entry 之前读取任何其他内容,则读取 fake_entry 会失败。

失败的例子:

openResult=RegOpenKeyEx( HKEY_LOCAL_MACHINE, _TEXT("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full"), 0, KEY_READ|KEY_WOW64_64KEY, &root);
readResult1=RegQueryValueEx(root, _TEXT("InstallPath"), NULL, NULL, data1, &size);
readResult2=RegQueryValueEx(root, _TEXT("fake_entry"), NULL, NULL, data2, &size);

在上面,InstallPath 读取有效,fake_entry 读取失败,出现“错误 2,ERROR_FILE_NOT_FOUND”。

有效的例子:

openResult=RegOpenKeyEx( HKEY_LOCAL_MACHINE, _TEXT("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full"), 0, KEY_READ|KEY_WOW64_64KEY, &root);
readResult2=RegQueryValueEx(root, _TEXT("fake_entry"), NULL, NULL, data2, &size);
readResult1=RegQueryValueEx(root, _TEXT("InstallPath"), NULL, NULL, data1, &size);

在上面,两种读取都有效。

为什么一个工作,另一个失败?真的可以订吗?每次调用 ReqQueryValueEx() 时都必须调用 RegOpenKeyEx() 吗?我在互联网上四处搜寻似乎显示并非如此。

是的,我知道这不是我应该更改的注册表位置。我在 was learning about 时偶然发现了这个KEY_WOW64_64KEY 并且很好奇为什么顺序似乎很重要。

在 Visual Studio 2010 中运行 Windows 7,64 位,C++,使用 ASCII 字符编码。

最佳答案

将一个变量 size 重复用作两次连续调用的 in-out 参数有些奇怪。这可能会导致接收到 ERROR_MORE_DATA

关于c++ - 读取 Windows 注册表时顺序是否重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19637006/

相关文章:

mysql - 使用 mysql、pthreads 和 gtk 在 C++ 中编译

vb6 - 从 Windows 注册表读取值?

c++ - 从 C++ 中的 HKEY 句柄确定注册表项的路径

c++ - 函数中 `delete this` 的行为

c++ - 如何在 OpenMP threadprivate 指令中使用对象的直接初始化?

c++ - 如何在Linux中将静态库链接到makefile

windows - 在终端的 Windows 中优雅地退出 golang

.net - 从 PowerShell 暂停或休眠

c++ - EnterCriticalSection死锁

c# - 在 C# 中为所有用户设置注册表项