15

我正在运行编译为 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}.

我该怎么做?使用 aRegistryView会产生意想不到的结果。例如,此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?

4

1 回答 1

20

我可能误解了您的要求,但是如果您在 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); 
于 2013-03-15T04:24:52.257 回答