写注册表的区分,怎么样设置程序开机自运行

  用C#实现注册表的读\写是一件很简单的作业,在此不做详细的讲课。

要是想要将1个exe程序设置为开机自运转,其实正是在HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\葡萄娱乐官方,Microsoft\Windows\CurrentVersion\Run注册表项中添加3个注册表变量,这一个变量的值是程序的各处路径。

  用C#操作注册表首要利用的多少个函数为(已经渗透到上边包车型地铁实例程序中,注:要引入Microsoft.Win32命名空间):

具体操作步骤是:

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

一 、使用RegistryKey类的CreateSubKey方法打开HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run变量,假使不设有,这么些方法会直接开立。
二 、假诺是增进1个变量的键值能够行使RegistryKey类的SetValue方法;
要是是去除八个变量的键值能够应用RegistryKey类的DeleteValue方法。

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

代码: 设置程序开机自运维状态

  这里首要讲解一下30位程序和六十个人程序在六拾二人平台上读\写注册表的界别【注:三十人程序是–>Build的Platform
target为X86;61位程序–>Build的Platform
target为X64;并且VS2008在暗中认可的动静下为X86编写翻译环境(即:30个人)】

using System;  
using System.Windows.Forms;  
using Microsoft.Win32;  
namespace RegistryUtil {  
       static class Program {  
              /// <summary>  
              /// 应用程序的主入口点。  
              /// </summary>  
              [STAThread]  
              static void Main() {  
                     Application.EnableVisualStyles();  
                     Application.SetCompatibleTextRenderingDefault(false);  
                     SetAutoBootStatu(true);  
              }  

              /// <summary>  
              /// 在注册表中添加、删除开机自启动键值  
              /// </summary>  
              public static int SetAutoBootStatu(bool isAutoBoot) {  
                     try {  
                            string execPath = Application.ExecutablePath;  
                            RegistryKey rk = Registry.LocalMachine;  
                            RegistryKey rk2 = rk.CreateSubKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run");  
                            if (isAutoBoot) {  
                                   rk2.SetValue("MyExec", execPath);  
                                   Console.WriteLine(string.Format("[注册表操作]添加注册表键值:path = {0}, key = {1}, value = {2} 成功", rk2.Name, "TuniuAutoboot", execPath));  
                            } else {  
                                   rk2.DeleteValue("MyExec", false);  
                                   Console.WriteLine(string.Format("[注册表操作]删除注册表键值:path = {0}, key = {1} 成功", rk2.Name, "TuniuAutoboot"));  
                            }  
                            rk2.Close();  
                            rk.Close();  
                            return 0;  
                     } catch (Exception ex) {  
                            Console.WriteLine(string.Format("[注册表操作]向注册表写开机启动信息失败, Exception: {0}", ex.Message));  
                            return -1;  
                     }  
              }  
       }  
}  

  简要复述一下反驳基础:微软为了让叁拾人程序不做其他改动就能运维在64的操作系统上,添加了三个那么些根本的WOW64子系统来贯彻这几个功用,WOW64是Windows-32-on-Windows-64的简称,从总体上来说,WOW64是一套基于用户情势的动态链接库,它能够把3叁位应用程序的产生的授命翻译成陆拾人系统基本上能用的格式,即:WOW
层处理诸如在 32 位和 64 位方式之间切换处理器以及模拟 34位系统的作业。

 

  三10个人与六十五个人特点的五个根本表现方面为:文件系统与注册表

要求注意的是:
Windows中微软的注册表消息是分3三人和60个人的:
32位:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
64位:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft

      文件系统:三十二人进度无法加载64人Dll,陆十二人进度也不能加载30位Dll。

以下代码

      注册表:为了幸免注册表键争执,63人机器注册表音讯分成了多少个部分。一部分是特地给六十三人系统(即:陆九人程序)访问的,另一局地是专门给三11人系统(即:34人程序)访问的,放在Wow6432Node上面。(Wow6432Node那些节
点存在于HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER下面)

RegistryKey rk =
Registry.LocalMachine;  
RegistryKey rk2 =
rk.CreateSubKey(“Software\\Microsoft\\Windows\\CurrentVersion\\Run”);  
rk2.SetValue(“MyExec”,
execPath);  

  既然知道了注册表音讯分成了两有的,那么就能够想到:用三16位程序和6四人程序去操作注册表的时候会操作不一致地点的注册表信息。上边例子能够充足申明这种说法。

在叁十几位机器上执行,那么没非常,变量会创制在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run下。可是一旦在六14人机器上推行,会自动创立在
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run

 

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(三13个人)平台下编写翻译、运维,会发觉在注册表的WOW6432Node节点下创办了子键:埃里克Sun\MyTestKey,并且填充了键MyKeyName的值(用时间再说差别其值),而在SoftWare的第二层子节点中并没有意识此EricSun。能够规定叁12位程序是操作注册表音讯是放在WOW6432Node节点下的

  若大家对那段程序不做其它改动,在X64(或Any
Cpu)的阳台下编写翻译、运维以来,会发觉在注册表的SoftWare节点的首先层子节点中创建出了埃里克Sun节点(并在此节点下创办相应的注册表新闻),然后大家用同样的主次去读注册表的时候也会发觉他们读取的地点差异(以程序中的时间新闻加以区分)

  总结:X64,(大概Any Cpu)
Platform下的程序会操作陆10个人机器存放注册表地方的注册表音信,X86
Platform下的程序会操作叁拾2个人机器存放注册表地点的注册表消息(即:WOW6432Node节点下的注册表音信)

转载于:http://www.cnblogs.com/mingmingruyuedlut/archive/2011/01/20/1940371.html