RegOpenKeyEx 找不到注册表项

Posted

技术标签:

【中文标题】RegOpenKeyEx 找不到注册表项【英文标题】:RegOpenKeyEx can't find registry key 【发布时间】:2016-03-15 12:09:46 【问题描述】:

我的程序应该枚举已安装的 OPOS 设备。它们列在注册表中,所以我像这样使用RegOpenKeyEx

LONG lResult = RegOpenKeyEx( HKEY_LOCAL_MACHINE, _T("SOFTWARE\\OLEforRetail\\ServiceOPOS\\PosPrinter"), 0, KEY_READ , &key );

它在我的电脑上运行良好,但在另一台机器上表现非常奇怪(windows 7 sp1 32bit)。

我有两个几乎相同的测试项目(都是 mfc 对话框应用程序,主要区别是一个是用 Visual Studio 2005 创建的,另一个是在 2010 年创建的)。在其中一个项目中,上面的代码工作正常,在另一个 RegOpenKeyEx 返回 ERROR_FILE_NOT_FOUND。此外,无法使用 regedit.exe 找到该密钥。

这里到底发生了什么?

【问题讨论】:

会不会是registry virtualisation 的问题?另一方面,如果 regedit and 您的程序找不到密钥,可能是因为密钥不存在。 【参考方案1】:

另外,在 regedit.exe 中找不到该密钥。

嗯,您需要确保您以正确的位数访问注册表。在 64 位操作系统上,“regedit.exe”将打开 64 位视图,而不是 32 位。您需要使用Windows\syswow64\regedit.exe 来打开 32 位视图。

您不能同时打开 32 位和 64 位 regedit.exe

对于您的程序,您需要检查它是 32 位还是 64 位。您还需要检查您是否获得了权限(检查链接器中的 UAC 标志)。

完成所有操作后,您可以继续启用或禁用注册表重定向,以便 32 位进程可以访问 64 位注册表,或者 64 位进程可以打开 32 位注册表视图。

【讨论】:

根据问题,它不工作的机器是32位机器,所以我认为不是问题。

以上是关于RegOpenKeyEx 找不到注册表项的主要内容,如果未能解决你的问题,请参考以下文章

RegOpenKeyEx 在 MASM64 中返回错误 87

regopenkeyex 在 Windows 8.1 上返回 2

64位读取注册表与32位的区别

RegOpenKeyEx 打开一个指定的注册表键

RegOpenKeyEx 返回错误 161

c++ 获取注册表项只返回一个字符