读取 Windows 注册表时命令是不是重要?

Posted

技术标签:

【中文标题】读取 Windows 注册表时命令是不是重要?【英文标题】:Can order matter when reading the Windows Registry?读取 Windows 注册表时命令是否重要? 【发布时间】:2013-10-28 14:10:26 【问题描述】:

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

当我在调用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 作为输入输出参数的方式有些奇怪。这可能会导致收到ERROR_MORE_DATA @Anton,是的,你是对的。就是这样。把它写下来作为答案,这样我就可以加分了。 另外不要使用 ASCII 字符编码。绝不。曾经。在为 Windows 编程时始终使用 UNICODE,除非您出于某种原因以 Windows 98 或 ME 为目标...en.wikipedia.org/wiki/Windows_98。 【参考方案1】:

在连续两次调用中重复使用一个变量size 作为输入输出参数的方式有些奇怪。这可能会导致收到ERROR_MORE_DATA

【讨论】:

以上是关于读取 Windows 注册表时命令是不是重要?的主要内容,如果未能解决你的问题,请参考以下文章

从 Windows 注册表中读取 DWord

如何检查是不是允许用户读取/写入特定注册表项?

Windows注册表的结构和编辑

win10系统如何设置读取用户组的权限?

如何轻松将 LPBYTE 转换为 char[256](用于从 Windows 注册表读取文本)

开机提示:由注册表引起的I/O操作发生了不可恢复的错误!注册表将不能读取、写出或刷新包含注册表系统图像的