C# 64位系统 注册表的读写

64位系统,读取时是要有区别的,写入时没有问题。这里的代码时通用的,已经内部判断当前系统的位数。

  1     /// <summary>
  2     /// 注册表
  3     /// </summary>
  4     public class RegistryKey64
  5     {
  6         #region 静态
  7         static IntPtr GetHiveHandle(RegistryHive hive)
  8         {
  9             IntPtr preexistingHandle = IntPtr.Zero;
 10
 11             IntPtr HKEY_CLASSES_ROOT = new IntPtr(-2147483648);
 12             IntPtr HKEY_CURRENT_USER = new IntPtr(-2147483647);
 13             IntPtr HKEY_LOCAL_MACHINE = new IntPtr(-2147483646);
 14             IntPtr HKEY_USERS = new IntPtr(-2147483645);
 15             IntPtr HKEY_PERFORMANCE_DATA = new IntPtr(-2147483644);
 16             IntPtr HKEY_CURRENT_CONFIG = new IntPtr(-2147483643);
 17             IntPtr HKEY_DYN_DATA = new IntPtr(-2147483642);
 18             switch (hive)
 19             {
 20                 case RegistryHive.ClassesRoot: preexistingHandle = HKEY_CLASSES_ROOT; break;
 21                 case RegistryHive.CurrentUser: preexistingHandle = HKEY_CURRENT_USER; break;
 22                 case RegistryHive.LocalMachine: preexistingHandle = HKEY_LOCAL_MACHINE; break;
 23                 case RegistryHive.Users: preexistingHandle = HKEY_USERS; break;
 24                 case RegistryHive.PerformanceData: preexistingHandle = HKEY_PERFORMANCE_DATA; break;
 25                 case RegistryHive.CurrentConfig: preexistingHandle = HKEY_CURRENT_CONFIG; break;
 26                 case RegistryHive.DynData: preexistingHandle = HKEY_DYN_DATA; break;
 27             }
 28             return preexistingHandle;
 29         }
 30         #endregion
 31
 32         #region 构造
 33         public RegistryKey64(RegistryHive hive, RegistryView view)
 34         {
 35             this.View = view;
 36             this.Hive = hive;
 37             this.SubKey = "";
 38             rootHandle = new SafeRegistryHandle(GetHiveHandle(hive), true);//获得根节点的安全句柄
 39         }
 40         public RegistryKey64(RegistryHive hive)
 41         {
 42             this.View = Environment.Is64BitOperatingSystem?RegistryView.Registry64: RegistryView.Registry32;
 43             this.Hive = hive;
 44             this.SubKey = "";
 45             rootHandle = new SafeRegistryHandle(GetHiveHandle(hive), true);//获得根节点的安全句柄
 46         }
 47         #endregion
 48
 49         #region 变量
 50         SafeRegistryHandle rootHandle = null;//顶级节点的句柄
 51         RegistryKey subKeyHandle = null;//当前子项的句柄
 52
 53         #endregion
 54
 55         #region 属性
 56         /// <summary>
 57         /// 当前所在路径
 58         /// </summary>
 59         public string SubKey { get; private set; }
 60         /// <summary>
 61         /// 顶级路径
 62         /// </summary>
 63         public RegistryHive Hive { get; private set; }
 64         /// <summary>
 65         /// 视图模式
 66         /// </summary>
 67         public RegistryView View { get;private set; }
 68         /// <summary>
 69         /// 内部系统注册表信息
 70         /// </summary>
 71         public RegistryKey RegistryKey { get { return this.subKeyHandle ?? RegistryKey.FromHandle(this.rootHandle, this.View); } }
 72         #endregion
 73         /// <summary>
 74         /// 用于32位程序访问64位注册表
 75         /// </summary>
 76         /// <param name="valueName">项名称</param>
 77         /// <returns>值</returns>
 78         public object GetValue(string valueName)
 79         {
 80             return this.subKeyHandle.GetValue(valueName);//获得键下指定项的值
 81         }
 82         /// <summary>
 83         /// 打开子项
 84         /// </summary>
 85         /// <param name="subName">子项名称</param>
 86         public void OpenKey(string subName)
 87         {
 88             RegistryKey key = this.RegistryKey.OpenSubKey(subName);
 89             if(key==null)
 90                 key=this.RegistryKey.CreateSubKey(subName);
 91             this.subKeyHandle = key;
 92             this.SubKey += "\\" + subName;
 93         }
 94         /// <summary>
 95         /// 用于32位的程序设置64位的注册表
 96         /// </summary>
 97         /// <param name="valueName">项名称</param>
 98         /// <param name="value">值</param>
 99         /// <param name="kind">值类型</param>
100         public void SetValue(string valueName, object value, RegistryValueKind kind)
101         {
102             this.subKeyHandle.SetValue(valueName, value, kind);
103         }
104     }

使用方法

1             RegistryKey64 key = new DTPM.Util.Configs.RegistryKey64(RegistryHive.LocalMachine);
2             key.OpenKey(@"SOFTWARE\XXX\XXX");
3             string path = key.GetValue("ConfigPath") as string;
4             key.RegistryKey.Close();

如果大家有改进,请留言,谢谢

时间: 2024-08-09 20:53:21

C# 64位系统 注册表的读写的相关文章

office 插件开发 -- 64位系统注册表问题

1 HKLM 2 { 3 NoRemove SOFTWARE 4 { 5 NoRemove Microsoft 6 { 7 NoRemove Office 8 { 9 NoRemove Word 10 { 11 NoRemove Addins 12 { 13 ForceRemove WordClientDemo.WordAddinDemo 14 { 15 var 'FriendlyName' = s 'WordAddinDemo' 16 var 'LoadBehavior' = d '3' 17

c#_自动化测试 (五) 读写64位操作系统的注册表

非Web程序(桌面程序)的设置一般都存在注册表中. 给这些程序做自动化测试时, 需要经常要跟注册表打交道. 通过修改注册表来修改程序的设置. 本章介绍如何利用C#程序如何操作注册表, 特别是如何操作64位操作系统的注册表. 阅读目录 自动化测试经常需要修改注册表 Windows注册表简介 C#修改注册表 32位机器和64位机器注册表的区别 C#程序访问64位操作系统的注册表 自动化测试经常需要修改注册表 很多系统的设置(比如:IE的设置)都是存在注册表中. 桌面应用程序的设置也是存在注册表中.

64位读取注册表与32位的区别

有一个读取注册表信息的程序  if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, subkeystring , 0, KEY_READ, &hKey) == ERROR_SUCCESS)/ ,在32位下完全正常,但是在64位返回值正确,但就是读不到东西.后来单步发现读不到东西,就搜64位读注册表失败,发现需要加 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, subkeystring , 0,KEY_READ|KEY_WOW64_64KEY, &am

win7的64位系统注册ocx控件

 win7的64位系统注册ocx控件 简介:前两天系统出问题了,导致开发环境很多插件需要重装, 当我针对winform的几个错误,安装控件解决时,就出现了错误, 始终装不上,如图: 解决方案: 1.首先复制 XXXX.OCX文件到"C:\Windows\SysWOW64"目录. (XXXX.OCX 是你准备注册的OCX控件) 2.在C:\Windows\sysWOW64 目录中找到cmd.exe的程序 3.右键单击该程序选择"管理员身份运行" 4.进入cmd D

64位系统注册32位的directshow filter文件

在SERVER2008上注册自己写的directshow filter 的dll或者ax文件的时候总是提示 [Window Title] RegSvr32 [Content] 模块".\ball.dll"加载失败. 请确保该二进制存储在指定的路径中,或者调试它以检查该二进制或相关的 .DLL 文件是否有问题. 找不到指定的模块. [确定] 经过查阅相关资料,发现必须使用C:\Windows\SysWOW64文件夹下的cmd,然后输入regsvr32 F:\MyRtspFilter\ba

32位程序访问64位系统上的Windows注册表

今天在工作的过程中遇到个奇怪的为问题,就是通过c#获取注册表键值的问题,一般都比较简单: string SQLPath = string.Empty; RegistryKey hkml = Registry.LocalMachine; RegistryKey MSSQLServerKey = hkml.OpenSubKey(@"SOFTWARE\MICROSOFT\MSSQLServer"); if (MSSQLServerKey != null) { string[] keys =

关于32位程序在64位系统下运行中需要注意的重定向问题(有图,很清楚)

0x00 前言 最近学习了[email protected]的文章<Persistence Architecture Matters>,恰巧解决了我之前遇到过的一个问题,理清了文件和注册表重定向中需要注意的细节 大家在学习的过程中难免也会碰到,所以在此分享一下. <Persistence Architecture Matters>的链接:https://labs.mwrinfosecurity.com/blog/persistence-architecture-matters/ 0

使用JRegistry来操作window系统注册表

在java中使用jdk自带的Preferences具有很大的局限性,无法访问全局的注册表信息,需要获取全部的注册表信息还需要依靠第三方的工具.在这里使用的是JRegistry,我们可以从这里http://sourceforge.jp/projects/sfnet_jregistry/ 获取到jar包和开发文档. 在开发需要把对应的 dll文件拷贝到包路径下面,提供32位和64位两种(不过64位的在使用的时候老是加载不上,64位系统+64位的Eclipse+64位jdk还是需要32位的dll文件,

C# 32位程序在64位系统下注册表操作

在64位的Windows操作系统中,为了兼容32位程序的运行,64位的Windows操作系统采用重定向机制.目的是为了能让32位程序在64位的操作系统不仅能操作关键文件文夹和关键的注册表并且又要避免与64位程序冲突 相关资料请查看32位程序在64位系统下运行的重定向机制 下面是以获取操作系统安装密匙KEY的案例: using System; using System.Collections.Generic; using System.Linq; using System.Text; using