读写来自同一应用程序的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.RegistryDefault
或RegistryView.Registry64
,而不是返回键-但我希望它返回null时使用Registry64
,因为该键不存在于x64视图,不应该有重定向发生。
是使用RegistryView
适当的事情要做,还是我应该使用WinAPI直接?
我可能误解了你的问题,但如果你在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);