读取 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 注册表时命令是不是重要?的主要内容,如果未能解决你的问题,请参考以下文章