C# 32位程序与64位程序读\写注册表的区别

转载 2012年03月29日 15:07:57

用C#实现注册表的读\写是一件很容易的事情,在此不做详细的讲解。

  用C#操作注册表主要用到的两个函数为(已经渗透到下面的实例程序中,注:要引入Microsoft.Win32命名空间):

      1:读取键值-->Registry.LocalMachine.OpenSubKey(“..Key的路径...”, true),这里的第2个bool类型的参数含义为:标志打开的键值是否可以更改(即:是否可以用SetValue()给键赋值),然后调用GetValue()方法就能把键值读取出来。

      2:写入键值-->Registry.LocalMachine.CreateSubKey("..Key的路径..."),然后调用SetValue()写入键值。

  这里主要讲解一下32位程序和64位程序在64位平台上读\写注册表的区别【注:32位程序是-->Build的Platform target为X86;64位程序-->Build的Platform target为X64;并且VS2010在默认的状态下为X86编译环境(即:32位)】

  简要复述一下理论基础:微软为了让32位程序不做任何修改就能运行在64的操作系统上,添加了一个十分重要的WOW64子系统来实现这个功能,WOW64是Windows-32-on-Windows-64的简称,从总体上来说,WOW64是一套基于用户模式的动态链接库,它可以把32位应用程序的发出的命令翻译成64位系统可以接受的格式,即:WOW 层处理诸如在 32 位和 64 位模式之间切换处理器以及模拟 32 位系统的事务。

  32位与64位特点的两个重要表现方面为:文件系统与注册表

      文件系统:32位进程不能加载64位Dll,64位进程也不可以加载32位Dll。

      注册表:为了防止注册表键冲突,64位机器注册表信息分成了两个部分。一部分是专门给64位系统(即:64位程序)访问的,另一部分是专门给32位系统(即:32位程序)访问的,放在Wow6432Node下面。(Wow6432Node这个节 点存在于HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER下面)

  既然知道了注册表信息分成了两部分,那么就可以想到:用32位程序和64位程序去操作注册表的时候会操作不同位置的注册表信息。下面例子可以充分证明这种说法。

using System;
  using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using Microsoft.Win32;
 
 namespace OperateRegistrationTable
 {
     class Programe
     {
         static void Main(string[] args)
         {
             OperatingRegistryKey();
         }
 
         public static void OperatingRegistryKey()
         {
             string keyValue = string.Empty;
             try
             {
                 //向注册表中写信息
                 using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\EricSun\MyTestKey", true))
                 {
                     if (key == null)
                     {
                         using (RegistryKey myKey = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\EricSun\MyTestKey"))
                         {
                             myKey.SetValue("MyKeyName", "Hello EricSun." + DateTime.Now.ToString());
                         }
                     }
                     else
                     {
                         key.SetValue("MyKeyName", "Hello EricSun." + DateTime.Now.ToString());
                     }
                 }
 
                 //读取注册表信息
                 using (RegistryKey currentKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\EricSun\MyTestKey", false))
                 {
                     if (currentKey == null)
                     {
                         Console.WriteLine("Hello EricSun, The Key you tried to open doesn't exist.");
                     }
                     else
                     {
                         keyValue = currentKey.GetValue("MyKeyName").ToString();
                         Console.WriteLine("The Key Value is: {0}", keyValue);
                     }
                 }
             }
             catch (Exception ex)
             { }
         }
     }
 }


将此段程序在X86(32位)平台下编译、运行,会发现在注册表的WOW6432Node节点下创建了子键:EricSun\MyTestKey,并且填充了键MyKeyName的值(用时间加以区分其值),而在SoftWare的第一层子节点中并没有发现此EricSun。可以确定32位程序是操作注册表信息是放在WOW6432Node节点下的

  若我们对这段程序不做任何修改,在X64(或Any Cpu)的平台下编译、运行的话,会发现在注册表的SoftWare节点的第一层子节点中创建出了EricSun节点(并在此节点下创建相应的注册表信息),然后我们用同样的程序去读注册表的时候也会发现他们读取的地方不同(以程序中的时间信息加以区分)

  总结:X64,(或者Any Cpu) Platform下的程序会操作64位机器存放注册表位置的注册表信息,X86 Platform下的程序会操作32位机器存放注册表位置的注册表信息(即:WOW6432Node节点下的注册表信息)


原文出自:http://www.cnblogs.com/mingmingruyuedlut/archive/2011/01/20/1940371.html

C# 32位/64位程序读写注册表之差异

用C#实现注册表的读\写是一件很容易的事情,在此不做详细的讲解。 用C#操作注册表主要用到的两个函数为(已经渗透到下面的实例程序中,注:要引入Microsoft.Win32命名空间): 1:读取键...
  • gongyuan303
  • gongyuan303
  • 2013年11月21日 11:55
  • 1690

C++ 32位程序枚举64位系统注册表子项,含关闭重定向和提权

MSDN:http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms724256(v=vs.85).aspx 原英文注释对应翻译了,方便朋友...
  • maxsky
  • maxsky
  • 2014年11月18日 12:04
  • 2913

*c#在64位上编写32位程序时注册表重定向的问题解决办法**

*c#在64位上编写32位程序时注册表重定向的问题解决办法*
  • junba118
  • junba118
  • 2017年06月15日 19:08
  • 154

64位Windows中32位程序注册表位置的非一般处理

64位Windows中32位程序注册表位置的特殊处理 最近在为公司的程序写一个小的注册配置工具。 在路径 HKEY_LOCAL_MACHINE\SOFTWARE 建立子项。 但是用Regedit...
  • thanklife
  • thanklife
  • 2017年04月12日 10:28
  • 703

64位操作系统注册表与C#对注册表操作

64位windows中包含了32位的和64位的两套系统程序,分别位于C:\Program Files (x86)和C:\Program Files中。IE,MediaPlayer等都有32位和64...
  • XueminXu
  • XueminXu
  • 2013年10月12日 10:45
  • 1457

32位和64位程序的区别

由于操作系统内存分配的不同,导致软件开发过程中,需要编译不同版本的软件,此处以VS为例。 1、编译程序根据需要选择不同的编译环境: X86和win32位32位程序,X64为64位程序,可以选择不同...
  • nma_123456
  • nma_123456
  • 2015年04月16日 17:13
  • 8579

32位程序与64位程序区别

转自:http://www.cnblogs.com/aHuner/p/3336028.html 32位系统由于采用了物理地址扩展技术,使得操作系统可用物理内存能够超过4G,但对于单个...
  • u010497228
  • u010497228
  • 2015年02月18日 00:09
  • 630

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

有一个读取注册表信息的程序  if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, subkeystring , 0, KEY_READ, &hKey) == ERROR_SUCC...
  • shmilxu
  • shmilxu
  • 2016年03月08日 21:37
  • 1360

64位和32位程序性能差别

64位系统和32位系统性能差别
  • a1009563517
  • a1009563517
  • 2016年07月27日 21:40
  • 1177

获取注册表路径或判断是64位还是32位

RegistryKey rsg = null;                    //声明变量             string win3264 = "";             try...
  • xiongyongting
  • xiongyongting
  • 2016年12月15日 16:17
  • 517
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 32位程序与64位程序读\写注册表的区别
举报原因:
原因补充:

(最多只允许输入30个字)