枚举注册表路径Country/region List失败,错误2(未找到)求助
问题分析与解决方案
核心原因:注册表32位/64位重定向
你碰到的问题本质是32位程序访问64位注册表项导致的。Windows为兼容32位程序,会自动把32位程序对HKEY_LOCAL_MACHINE\SOFTWARE的访问,重定向到HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node分支,但Country/region List实际只存在于64位的SOFTWARE分支里,不在重定向的路径中。这正好对应你遇到的两个现象:
- 枚举父节点
Telephony时看不到RegEdit里的Country/region List——因为你枚举的是重定向后的32位分支子项,该子项仅在64位分支存在。 - 直接打开
Country/region List报错误2(未找到)——32位程序默认访问重定向路径,自然找不到实际的64位项。
- 枚举父节点
解决办法
调用CRegKey::Open时,添加KEY_WOW64_64KEY标志,强制绕过重定向,直接访问64位注册表分支:// 打开Country/region List时添加64位访问标志 ASSERT(CRegKey{}.Open(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Telephony\\Country/region List"), KEY_ENUMERATE_SUB_KEYS | KEY_WOW64_64KEY) == ERROR_SUCCESS);枚举父节点
Telephony要看到64位分支的子项,同样需要加这个标志:if (regKey.Open(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Telephony"), KEY_ENUMERATE_SUB_KEYS | KEY_WOW64_64KEY) == ERROR_SUCCESS) { for (DWORD dwIndex = 0; ; ++dwIndex) { TCHAR szCountry[64]; DWORD dwLen = MfxCountOf(szCountry); if (regKey.EnumKey(dwIndex, szCountry, &dwLen) != ERROR_SUCCESS) break; // 处理枚举到的子项 } }验证方式
你可以手动打开RegEdit,查看HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Telephony,里面确实没有Country/region List;而64位的SOFTWARE分支下是存在该子项的,这能直接验证上述结论。
内容的提问来源于stack exchange,提问作者xMRi
相关产品推荐
相关产品推荐

