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

原文:使用.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版本以上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【51单片机快速入门指南】4.4.2:Mahony AHRS 九轴姿态融合获取四元数、欧拉角

目录传感器的方向源码Mahony_9.cMahony_9.h使用方法测试main.c效果STC15F2K60S2 22.1184MHz Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 上位机&#xff1a;Vofa 1.3.10 移植自MPU6050 获取角度理论推导(三)—9轴融合算法 —— shao15232_1 传感器…

BZOJ 2160 拉拉队排练

2160: 拉拉队排练 Description 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了。拉拉队是篮球比赛的一个看点&#xff0c;好的拉拉队往往能帮助球队增加士气&#xff0c;赢得最终的比赛。所以作为拉拉队队长的楚雨荨同学知道&#xff0c;帮助篮球队训练好拉拉队有多么的重要…

React Native获取设备信息组件

转载 https://www.jianshu.com/p/907b003835dc本文原创首发于公众号&#xff1a;ReactNative开发圈&#xff0c;转载需注明出处。这次介绍的获取移动设备信息的组件名叫&#xff1a;react-native-device-info&#xff0c;兼容IOS和安卓双平台&#xff0c;可以获取设备ID、设备品…

UNIX网络编程——套接字选项(SO_RCVBUF和SO_SNDBUF)

有时候我们需要控制套接字的行为(如修改缓冲区的大小),这个时候我们就要学习套接字选项。int getsockopt(int sockfd,int level,int optname,void *optval,socklen_t *optlen) int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen)level指定…

【51单片机快速入门指南】4.4.3:Madgwick AHRS 九轴姿态融合获取四元数、欧拉角

目录传感器的方向源码Madgwick_9.cMadgwick_9.h使用方法测试main.c效果STC15F2K60S2 22.1184MHz Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 上位机&#xff1a;Vofa 1.3.10 移植自AHRS —— LOXO&#xff0c;算法作者&#xff1a;SOH Madgwick 传…

室内定位 - 资料收集

微信小程序API——获取定位 微信小程序定位权限开启或关闭怎么控制 小蜜引路&#xff1a;室内定位导航微信小程序 自己动手 IBeacon 室内定位 完整体验&#xff08;超详细过程&#xff09; 10种室内定位技术原理深度解析

关于json格式字符串解析并用mybatis存入数据库

园子里面找了很多关于json解析后存入数据库的方法&#xff0c;不是太乱&#xff0c;就是没有写完&#xff0c;我下面的主题代码多是受下面两位的启发&#xff0c;请按顺序查看 http://www.cnblogs.com/tian830937/p/6364622.html,我沿用了这个例子中的json数据格式&#xff0c;…

网络软件的组成

在计算机网络系统中&#xff0c;除了各种网络硬件设备外&#xff0c;还必须具有网络软件 1、网络操作系统 网络操作系统是网络软件中最主要的软件,用于实现不同主机之间的用户通信&#xff0c;以及全网硬件和软件资源的共享&#xff0c;并向用户提供统一的、方便的网络接口,便于…

【Hibernate3.3复习知识点二】 - 配置hibernate环境(annotations)

配置文件hibernate.cfg.xml中引入&#xff1a;<mapping class"com.bjsxt.hibernate.Teacher"/> <hibernate-configuration><session-factory><!-- Database connection settings --><property name"connection.driver_class"&g…

室内定位 -- 资料收集

室内定位系列&#xff08;一&#xff09;——WiFi位置指纹&#xff08;译&#xff09;

【51单片机快速入门指南】4.5:I2C 与 TCA6416实现双向 IO 扩展

目录硬知识IO 扩展芯片 TCA6416ATAC6416A 的寄存器IO 输入寄存器IO 输出寄存器IO 反相寄存器IO 方向寄存器TCA6416A 的操作TCA6416A 写数据TCA6416A 读数据TCA6416A 的 IO 输入寄存器硬件布局示例程序TCA6416A.cTCA6416A.h测试程序main.c实验现象普中51-单核-A2 STC89C52 MSP43…

linux/window 下 solr5.1 tomcat7.x 环境搭建即简单功能测试

2019独角兽企业重金招聘Python工程师标准>>> 之所以想使用solr来进行学习&#xff0c;很大一部分原因就是&#xff0c;solr能够在某种程度上提供RESTFUL相关的URL请求连接&#xff0c;可以把它理解为 以搜索引擎为基础的存储服务系统 &#xff0c;由于他的搜索可以是…

【Java基础总结】多线程

1. 实现多线程的两种方式 1 //第一种&#xff1a;继承Thread类&#xff0c;重写run()方法2 class ThreadTest1 extends Thread{3 public void run(){4 String threadName Thread.currentThread().getName();5 for(int i0;i<10;i){6 System…

C++类分号(;)问题

环境&#xff1a;vs2010 问题&#xff1a;今天编代码过程中发现好多很奇怪的错误&#xff0c;我以为昨天调了下编译器才出问题了。搞了好久&#xff0c;代码注释掉很多还是不行,并且错误还一直在变化。问题大概如下&#xff1a; &#xff08;照片上传不了&#xff09; 1.error …

PHP远程连接MYSQL数据库非常慢的解决方法

不知道如何解决&#xff0c;所以把他空间所在的服务器上也装了个MYSQL,才解决问题&#xff0c;今天又有个这个问题&#xff0c;不能也在这服务器上装一个MYSQL吧&#xff0c;Search: PHP远程连接MYSQL速度慢,有时远程连接到MYSQL用时4-20秒不等,本地连接MYSQL正常,出现这种问题…

【51单片机快速入门指南】5:软件SPI

目录硬知识SPI协议简介SPI接口介绍SPI接口连接图SPI数据传输方向SPI传输模式软件SPI程序源码Soft_SPI.cSoft_SPI.h普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 上位机&#xff1a;Vofa 1.3.10 源于软件模拟SPI接口程序代码&…

svn搭建本地服务端

使用VisualSVN Server来完成,下载地址:https://www.visualsvn.com/server/download/ 我安装的版本是3.3.1,安装的时候选择了标准版本&#xff0c;另外一个版本需要付费(日志跟踪、VDFS等功能)更多可以参考https://www.visualsvn.com/server/licensing/安装完成之后&#xff0c;…

hdu 4612 边连通度缩点+树的最长路径

思路&#xff1a;将以桥为分界的所有连通分支进行缩点&#xff0c;得到一颗树&#xff0c;求出树的直径。再用树上的点减去直径&#xff0c;再减一 #pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #incl…

c++ primer 4.4节练习答案

练习4.13 a) d3.0, i3 b) i3, d3.5 练习4.14 第一个&#xff1a;非法&#xff0c;42是一个右值&#xff0c;右值不能当做左值使用 第二个&#xff1a;返回值总为真 练习4.15 pi是指针类型&#xff0c;不可将int类型指针赋值给int型&#xff0c;可做如下修改 dval ival 0; pi …

详解Ubuntu Server下启动/停止/重启MySQL数据库的三种方式(ubuntu 16.04)

启动mysql&#xff1a; 方式一&#xff1a;sudo /etc/init.d/mysql start 方式二&#xff1a;sudo service mysql start 停止mysql&#xff1a; 方式一&#xff1a;sudo /etc/init.d/mysql stop 方式二&#xff1a;sudo service mysql stop 重启mysql&#xff1a; 方式一…