我试图在当前安装的Office即点即用中获取一些数据。
我已阅读这些帖子:Can't Read Registry Key或OpenSubKey() returns null for a registry key that I can see in regedit.exe
我在Windows 10 64bit上。我的应用程序是Outlook加载项,因此我无法更改目标平台(32/64位),它是确定我是否在32位或64位运行的主机。所以我要处理这两种情况。
所以我这个(测试)代码:
using (var hklmTest64 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64))
{
var test = hklmTest64.GetValue(@"SOFTWARE\Microsoft\Office\ClickToRun\Configuration\AudienceData");
if (test == null)
{
using (var hklmTest32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32))
{
test = hklmTest32.GetValue(@"SOFTWARE\Microsoft\Office\ClickToRun\Configuration\AudienceData");
}
}
}
所以我首先使用64位视图获取注册表项,然后如果为null,则使用32位视图重试。
问题:测试总是NULL
当然密钥存在,我可以使用regedit看到它:
当然,我首先尝试了一些简单的代码,直到现在一直对我有用,但是无法获取此密钥:
test = Registry.LocalMachine.GetValue(@"SOFTWARE\Microsoft\Office\ClickToRun\Configuration\AudienceData");
test = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\ClickToRun\Configuration", "AudienceData", null);
更奇怪的是,我在获取Windows内部版本号时遇到了完全相同的问题。此代码无效:
var wBuild = Registry.LocalMachine.GetValue(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ReleaseId");
但是这个适用于windows build(不适用于outlook键):
var wBuild = Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion", "ReleaseId", null);
知道如何获取此注册表项吗?
更新1
查看帖子C# get Office ClickToRun Registry Key returns null
但阅读帖子后,我的代码使用RegistryView.RegistryXX
应该有效......
更新2
我使用LinqPad重新解决了这个问题,所以这不是由于Outlook主机/加载项造成的。我试图在.NET Fiddle中重新编写,但实际上代码不允许访问注册表:)
我可以使用P / Invoke获取正确的值,如解释in this article。所以对我而言,这显然是一个32 / 64bit(wow6432node)问题。
答案 0 :(得分:0)
RegistryKey.OpenBaseKey
只需使用Registry.GetValue(keyName, valueName, defualt value)
这是工作示例
string InstallPath = (string)Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\" + path, "ActivationCode", null);
答案 1 :(得分:0)
我可以使用P / Invoke获得正确的值,如本文所述。所以对我来说,这显然是一个32/64位(wow6432node)问题。