从同一应用程序读取和写入x86和x64注册表项

时间:2013-03-15 03:31:36

标签: c# .net registry x86-64

我正在运行编译为x86的应用程序,它在64位Windows上运行。

为了解决ClickOnce文件关联的问题,我想从注册表的x86视图中读取一些CLSID值,然后将它们写入x64视图。

要清楚,这意味着从x86应用程序我想同时从x86注册表视图中读取,然后写入x64注册表视图。我想获取HKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid}下的值,并将其写入HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{my clsid}

我该怎么做?使用RegistryView会产生意外结果。例如,此OpenSubKey调用返回null:

keyPath = @"Software\Classes\CLSID\" + clsid;
var regularx86View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32);
var regularClassKey = regularx86View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadSubTree);

如果我使用RegistryView.RegistryDefaultRegistryView.Registry64而不是它返回密钥 - 但我希望它在使用Registry64时返回null,因为该密钥在x64视图中不存在不应该进行重定向。

正在使用RegistryView做适当的事情,还是应该直接使用WinAPI?

1 个答案:

答案 0 :(得分:19)

我可能会误解你的问题,但如果你在32位进程中运行,那么你的所有密钥都会在Wow6432Node\xxxxx节点中。因此,如果您尝试将它们从HKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid}(并且未手动指定64位视图)复制到HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{my clsid},则您将复制相同的值。这段代码应该有效:

keyPath = @"Software\Classes\CLSID\" + clsid;
var regularx86View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry32);
// Note this calls HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{my clsid}:
var regularClassKey = regularx86View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadSubTree); 

var regularx64View = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64);
// Note this calls HKEY_CURRENT_USER\Software\Classes\CLSID\{my clsid}:
var regularClassKey = regularx64View.OpenSubKey(keyPath, RegistryKeyPermissionCheck.ReadSubTree);