原文:使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表

我们知道目标平台是32位的程序运行在64位的系统上,去访问部分注册表的时候系统自动重定向到win32node节点对应的项去了。但是做过安装程序开发人员可能遇到过“需要去掉重定向”的问题,即直接访问64位程序的注册表。

网上有很多winAPI的方法,关闭注册表的重定向稍微复杂。(关闭文件系统的重定向稍微简单些,搬过来就可以用;关闭注册表的重定向我现在没看懂。)

我这里提供的方法不需要关闭重定向,也不需要用winAPI,操作起来方便了许多。具体如下:

   第一个方法是获得根节点的句柄,常数是固定的。

     static IntPtr GetHiveHandle(RegistryHive hive){IntPtr preexistingHandle = IntPtr.Zero;IntPtr HKEY_CLASSES_ROOT = new IntPtr(-2147483648);IntPtr HKEY_CURRENT_USER = new IntPtr(-2147483647);IntPtr HKEY_LOCAL_MACHINE = new IntPtr(-2147483646);IntPtr HKEY_USERS = new IntPtr(-2147483645);IntPtr HKEY_PERFORMANCE_DATA = new IntPtr(-2147483644);IntPtr HKEY_CURRENT_CONFIG = new IntPtr(-2147483643);IntPtr HKEY_DYN_DATA = new IntPtr(-2147483642);switch (hive){case RegistryHive.ClassesRoot: preexistingHandle = HKEY_CLASSES_ROOT; break;case RegistryHive.CurrentUser: preexistingHandle = HKEY_CURRENT_USER; break;case RegistryHive.LocalMachine: preexistingHandle = HKEY_LOCAL_MACHINE; break;case RegistryHive.Users: preexistingHandle = HKEY_USERS; break;case RegistryHive.PerformanceData: preexistingHandle = HKEY_PERFORMANCE_DATA; break;case RegistryHive.CurrentConfig: preexistingHandle = HKEY_CURRENT_CONFIG; break;case RegistryHive.DynData: preexistingHandle = HKEY_DYN_DATA; break;}return preexistingHandle;}/// <summary>/// 用于32位程序访问64位注册表/// </summary>/// <param name="hive">根级别的名称</param>/// <param name="keyName">不包括根级别的名称</param>/// <param name="valueName">项名称</param>/// <param name="view">注册表视图</param>/// <returns>值</returns>static object GetValueWithRegView(RegistryHive hive, string keyName, string valueName, RegistryView view){SafeRegistryHandle handle = new SafeRegistryHandle(GetHiveHandle(hive), true);//获得根节点的安全句柄
RegistryKey subkey = RegistryKey.FromHandle(handle, view).OpenSubKey(keyName);//获得要访问的键
RegistryKey key = RegistryKey.FromHandle(subkey.Handle, view);//根据键的句柄和视图获得要访问的键return key.GetValue(valueName);//获得键下指定项的值
        }/// <summary>/// 用于32位的程序设置64位的注册表/// </summary>/// <param name="hive">根级别的名称</param>/// <param name="keyName">不包括根级别的名称</param>/// <param name="valueName">项名称</param>/// <param name="value">值</param>/// <param name="kind">值类型</param>/// <param name="view">注册表视图</param>static void SetValueWithRegView(RegistryHive hive, string keyName, string valueName, object value, RegistryValueKind kind, RegistryView view){SafeRegistryHandle handle = new SafeRegistryHandle(GetHiveHandle(hive), true);RegistryKey subkey = RegistryKey.FromHandle(handle, view).OpenSubKey(keyName, true);//需要写的权限,这里的true是关键。0227更新
RegistryKey key = RegistryKey.FromHandle(subkey.Handle, view);key.SetValue(valueName, value, kind);}

使用这些方法需要引入Microsoft.Win32.SafeHandles;Microsoft.Win32;system;这三个命名空间。方法只提供了主干,没有异常处理。望大家及时交流实际使用情况,不足之处请及时指出。

关于winAPI的方法可以访问http://home.cnblogs.com/u/xuguilin/相应的文章,同时也感谢xuguilin对我的指导。据介绍dotNet框架可能需要4.0版本以上

使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表相关推荐

  1. 【转载】solidworks卸载方法,怎么完全彻底卸载删除清理干净solidworks各种残留注册表和文件?

    solidworks卸载工具,完全彻底删除干净solidworks各种残留注册表和文件.solidworks安装失败,怎么完全彻底删除清理干净solidworks各种残留注册表和文件呢?有些同学想把s ...

  2. 解决ADSL拨号出现访问错误623 系统无法找到电话薄

    Win7系统默认拨号名称为"宽带连接",WinXP默认为"ADSL拨号". 使用"rasdial 宽带连接 宽带用户名 宽带密码"进行拨号时 ...

  3. VS2019编译32位程序运行于XP系统

    文章目录 平台工具集 关闭符合模式 一系列dll库 win10中的32位dll搬过去后(错误操作) 安装vcruntime.exe 平台工具集 换成带有XP字眼的,如 如果没有在installer进行 ...

  4. 在64位操作系统上运行32位的程序

    运行 32 位程序 WOW64 子系统使 32 位程序能够在基于 x64 版本的 Windows Server 2003 和 Windows XP 专业 x64 版的运行而不用修改.WOW64 子系统 ...

  5. 32位应用程序操作64位Windows注册表的方法

    64位的Windows操作系统中能够运行32位的应用程序,主要是由于Windows中提供了WOW64子系统. 1.WOW64子系统 WOW64 (Windows-on-Windows 64-bit)是 ...

  6. 四种方法解决:Windows10下使用SVN文件夹不显示小绿勾

    此问题有多种解决方案,在此列出主流观点. 方法1.右键没显示小绿勾的文件夹,按照图片顺序操作 再按照图片操作 重启. 或如下图示代替重启, 结束任务 启动任务,运行新任务 方法2. 1.Win+R,输 ...

  7. 最全的Windows注册表介绍及优化方法

    注册表(registry)原意是登记表,是Windows里的一个重要数据库,用于存储系统和应用程序的设置信息,就像户口本上登记家庭住址和邮编信息一样.如果一个人户口本上内容丢失,那么他在户籍管理系统上 ...

  8. 在64位linux下编译32位程序

    一般情况下我们最好是在一个平台上编译本平台的二进制程序,比如在32位平台上编译32位程序而在64位平台上编译64位程序. 现在64位的系统(这里主要指x86_64系统,包括AMD64和Intel的EM ...

  9. 32位程序和64位程序这些区别你知道吗?

    我们在编写C/C++程序时,32位程序和64位程序的代码有何区别?如何编写既可以编译成32位程序又可以编译成64位程序的代码? 代码上的区别 实际上,对于32位程序和64位程序来说,代码上的区别不大, ...

最新文章

  1. 20应用统计考研复试要点(part26)--简答题
  2. LESS实战::not与:hover混合使用
  3. 时间组件选择一个时间段_衡南(光伏支架组件安装)施工队
  4. ssh隧道 mysql,如何通过SSH隧道连接MySQL
  5. 整合了一下网上的内容,excel工作簿全部公式转换为值
  6. Node介绍及环境配置~超级详细哦
  7. 9.2 配置rsync+inotify实时同步
  8. CentOS更改主机名
  9. PMP第十三章:项目相关方管理
  10. FL Studio下载2020水果软件注册机音频剪辑功能讲解教程
  11. 运算放大器---封装尺寸
  12. 网页制作html+css+javascript
  13. 【华人学者风采】周明 微软亚洲研究院
  14. android框架百大排行榜
  15. mysql自动填充测试数据库_入门篇(三):通过填充器快速填充测试数据
  16. 【hadoop权威指南第四版】第三章hadoop分布式文件系统【笔记+代码】
  17. ognl.NoSuchPropertyException(没有对应属性异常)
  18. Electron渲染页面(Renderer Process)引入ipcRenderer
  19. C++标准库,框架等资源大汇总!
  20. 鹏孚隆冲刺创业板上市:计划募资约7亿元,部分收入来自海外

热门文章

  1. spring 动态代理_分析动态代理给 Spring 事务埋下的坑
  2. python控制手机自动刷新闻_Python控制android手机实现微信自动跳一跳
  3. 运算符与,|与||的区别
  4. string类的基本实现
  5. socket 编程篇六之IPO多路复用-select poll epoll
  6. 【算法训练】Leetcode 1295. 统计位数为偶数的数字(2020.06.09 )
  7. 01-复杂度2 Maximum Subsequence Sum (25 分)
  8. CRM公海自动回收规则
  9. 【转】测试过程管理案例6---如何做项目的测试经理?
  10. 2011股市大方向随想