使用.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位注册表相关推荐
- 【转载】solidworks卸载方法,怎么完全彻底卸载删除清理干净solidworks各种残留注册表和文件?
solidworks卸载工具,完全彻底删除干净solidworks各种残留注册表和文件.solidworks安装失败,怎么完全彻底删除清理干净solidworks各种残留注册表和文件呢?有些同学想把s ...
- 解决ADSL拨号出现访问错误623 系统无法找到电话薄
Win7系统默认拨号名称为"宽带连接",WinXP默认为"ADSL拨号". 使用"rasdial 宽带连接 宽带用户名 宽带密码"进行拨号时 ...
- VS2019编译32位程序运行于XP系统
文章目录 平台工具集 关闭符合模式 一系列dll库 win10中的32位dll搬过去后(错误操作) 安装vcruntime.exe 平台工具集 换成带有XP字眼的,如 如果没有在installer进行 ...
- 在64位操作系统上运行32位的程序
运行 32 位程序 WOW64 子系统使 32 位程序能够在基于 x64 版本的 Windows Server 2003 和 Windows XP 专业 x64 版的运行而不用修改.WOW64 子系统 ...
- 32位应用程序操作64位Windows注册表的方法
64位的Windows操作系统中能够运行32位的应用程序,主要是由于Windows中提供了WOW64子系统. 1.WOW64子系统 WOW64 (Windows-on-Windows 64-bit)是 ...
- 四种方法解决:Windows10下使用SVN文件夹不显示小绿勾
此问题有多种解决方案,在此列出主流观点. 方法1.右键没显示小绿勾的文件夹,按照图片顺序操作 再按照图片操作 重启. 或如下图示代替重启, 结束任务 启动任务,运行新任务 方法2. 1.Win+R,输 ...
- 最全的Windows注册表介绍及优化方法
注册表(registry)原意是登记表,是Windows里的一个重要数据库,用于存储系统和应用程序的设置信息,就像户口本上登记家庭住址和邮编信息一样.如果一个人户口本上内容丢失,那么他在户籍管理系统上 ...
- 在64位linux下编译32位程序
一般情况下我们最好是在一个平台上编译本平台的二进制程序,比如在32位平台上编译32位程序而在64位平台上编译64位程序. 现在64位的系统(这里主要指x86_64系统,包括AMD64和Intel的EM ...
- 32位程序和64位程序这些区别你知道吗?
我们在编写C/C++程序时,32位程序和64位程序的代码有何区别?如何编写既可以编译成32位程序又可以编译成64位程序的代码? 代码上的区别 实际上,对于32位程序和64位程序来说,代码上的区别不大, ...
最新文章
- 20应用统计考研复试要点(part26)--简答题
- LESS实战::not与:hover混合使用
- 时间组件选择一个时间段_衡南(光伏支架组件安装)施工队
- ssh隧道 mysql,如何通过SSH隧道连接MySQL
- 整合了一下网上的内容,excel工作簿全部公式转换为值
- Node介绍及环境配置~超级详细哦
- 9.2 配置rsync+inotify实时同步
- CentOS更改主机名
- PMP第十三章:项目相关方管理
- FL Studio下载2020水果软件注册机音频剪辑功能讲解教程
- 运算放大器---封装尺寸
- 网页制作html+css+javascript
- 【华人学者风采】周明 微软亚洲研究院
- android框架百大排行榜
- mysql自动填充测试数据库_入门篇(三):通过填充器快速填充测试数据
- 【hadoop权威指南第四版】第三章hadoop分布式文件系统【笔记+代码】
- ognl.NoSuchPropertyException(没有对应属性异常)
- Electron渲染页面(Renderer Process)引入ipcRenderer
- C++标准库,框架等资源大汇总!
- 鹏孚隆冲刺创业板上市:计划募资约7亿元,部分收入来自海外
热门文章
- spring 动态代理_分析动态代理给 Spring 事务埋下的坑
- python控制手机自动刷新闻_Python控制android手机实现微信自动跳一跳
- 运算符与,|与||的区别
- string类的基本实现
- socket 编程篇六之IPO多路复用-select poll epoll
- 【算法训练】Leetcode 1295. 统计位数为偶数的数字(2020.06.09 )
- 01-复杂度2 Maximum Subsequence Sum (25 分)
- CRM公海自动回收规则
- 【转】测试过程管理案例6---如何做项目的测试经理?
- 2011股市大方向随想