读写来自同一应用程序的x86和x64注册表项

本文关键字:x86 x64 注册表 应用程序 读写 | 更新日期: 2023-09-27 18:04:13

我正在运行编译为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,而不是返回键-但我希望它返回null时使用Registry64,因为该键不存在于x64视图,不应该有重定向发生。

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

读写来自同一应用程序的x86和x64注册表项

我可能误解了你的问题,但如果你在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);