none
OpenSubKey打不开某些注册表 RRS feed

  • 问题

  • 我想使用OpenSubKey打开某个注册表项并读取其中的键值但是不知道为什么同样的代码两个项目中却一个可以读取一个就不能读取,即如下代码中的reg在项目1中为null在项目2中正常,已确定该项在注册表中是存在的。

    private string GetQQVersion()
            {
                RegistryKey key = Registry.LocalMachine;
                var reg = key.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Products\97BFC25026D93E24A851ED662C9CC7E3\InstallProperties", false);
                if (reg == null) { return "未知的版本,请确认是否安装了QQ。"; }
                var info = reg.GetValue("DisplayVersion");
                if (info != null) { return info.ToString(); }
                return "未知的QQ版本";
            }
    求解这是什么原因,是因为权限还是因为什么,我的开发环境是win8.1+VS2013+C#。谢谢!

    补充点东西,经测试把注册表项换成“SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\”是可以打开的。


    • 已编辑 Schme 2014年12月29日 10:04 补充
    2014年12月29日 10:03

全部回复

  • 你好:

    两台机器的系统都是一样的吗?如果一台是32位的一台是64位的那么有可能会读取为空,尝试这个方法正确读取LocalMachine注册表项:

    RegistryKey localMachineRegistry
                    = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine,
                                              Environment.Is64BitOperatingSystem
                                                  ? RegistryView.Registry64
                                                  : RegistryView.Registry32);
    


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年12月30日 2:24
    版主
  • 您好,首先十分感谢您的解答,不过我的不是两个机器是一个机器上的两个项目我在demo里写的时候都是正常的挪到项目里就打不开了。另外我的机器是64位的使用的是.net2.0编译的程序。
    2014年12月30日 4:50
  • 另外我的代码为什么提示我没有OpenBaseKey方法?
    2014年12月30日 5:30
  • 这个是.net4.0以后才有的方法。

    我猜测你的机器应该是64位的,而你的这两个项目的编译的目标平台有可能一个是x86的一个是x64的,你可以检查一下两个项目:

    Project Properties>Build>Target platform

    如果程序集是32位的,而机器是64位的,RegistryKey会默认转向HKLM>Software>Wow6432Node下面去找相关节点,而不是在Software下面找。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年12月30日 8:12
    版主
  • 的确我的机器是64位的,那我该怎么来做才能让他选择正确的节点呢?
    2014年12月31日 1:32
  • 我上个回复已经解释了其实,如果程序集的编译平台是x86的话,那么会默认转到到Wow6432Node节点下去寻找子节点,而不是在HKLM>Software根节点下寻找,所以你可以尝试一下将项目编译平台选择x64,你之前可以运行的那个项目的编译平台也应该是x64的。

    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年12月31日 2:39
    版主
  • 谢谢,我明白您说的,只不过我的项目要求必须是X86的而且我的代码是.net2.0编译的没法用您给的方法。
    2015年1月6日 3:34
  • 查找MSI安装的软件的API是MsiEnumProducts


    Visual C++ MVP

    2015年1月6日 4:30
    版主