HKEY_CLASSES_ROOT\CLSID 并非所有子项都被检索。找不到我的 CLASSID
Posted
技术标签:
【中文标题】HKEY_CLASSES_ROOT\\CLSID 并非所有子项都被检索。找不到我的 CLASSID【英文标题】:HKEY_CLASSES_ROOT\CLSID Not all subkeys are retrieved. Can't find my CLASSIDHKEY_CLASSES_ROOT\CLSID 并非所有子项都被检索。找不到我的 CLASSID 【发布时间】:2020-03-17 01:28:11 【问题描述】:我已经注册了 COM 组件(shell 扩展)。我打开了 regedit 并在上面找到了注册的 CLSID。 我需要检查密钥是否以编程方式在注册表中注册。所以我试图从代码中找到它:从 HKEY_CLASSES_ROOT\CLSID 检索所有子键。我得到了一组子密钥。但是我看不到带有我的 CLSID 的子键! 这是我的代码。
var res2 = RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Registry32)
.OpenSubKey("CLSID")
.GetSubKeyNames()
.ToList();
res2.ForEach(e => Console.WriteLine(e));
On image regedit vs my code results
我尝试在 C++/WinAPI 上执行类似的操作,但遇到了同样的问题。试图以“管理员身份”在其他 PC 上运行它,但没有成功。那么我怎样才能以编程方式获取这个子键呢?
【问题讨论】:
可能是经典的 x86 与 x64 问题。当您的组件在 64 位注册表中注册时,您可能正在查看 32 位注册表,反之亦然。 与流行的传说相反,您实际上无法在大海捞针。 Regedit.exe 按名称对键进行排序,而您的程序不会。控制台输出 looks 排序是操作系统安装事故。请避免使用 HKCR,它是一个用于 16 位 appcompat 的虚拟配置单元。您的安装程序将密钥写入 HKLM/Software/Classes/CLSID。现在 RegistryView 很重要,因为这是一个 shell 扩展,您确实需要 64 位视图。 【参考方案1】:所以,是的,需要更改 RegistryView.Registry32 => RegistryView.Registry64 非常愚蠢和愚蠢的错误。 谢谢大家!
【讨论】:
以上是关于HKEY_CLASSES_ROOT\CLSID 并非所有子项都被检索。找不到我的 CLASSID的主要内容,如果未能解决你的问题,请参考以下文章