twzheng's cppblog

『站在风口浪尖紧握住鼠标旋转!』 http://www.cnblogs.com/twzheng

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  136 随笔 :: 78 文章 :: 353 评论 :: 0 Trackbacks

从零讲起 彻底走出注册表应用的迷雾

摘自:岁月联盟 - 技术社区
Windows始终有一快菜鸟的禁区,那就是注册表。Windows将其运行时所需的配置信息存储在以树状格式组织的数据库(注册表)中,只要知道设置对应的注册表位置,就能对系统中几乎所有的设置进行修改。但微软官方对于注册表的资料实在有限,菜鸟对于注册表操作就更感觉无从下手了,就像在黑暗中行走。

  四盏照明灯带你走出注册表误区

  误区1.普通用户不应该修改注册表

  微软对于注册表的态度一直有些隐瞒,甚至在帮助文件中都写道:“尽管可以用注册表编辑器查看和修改注册表,但通常不比这样做,因为更改不正确可能会损坏系统。”微软希望所有的系统设置都能够在其设计的系统管理工具中进行,而不是修改注册表,正因为微软自身都对用户修改注册表抱不置可否的态度,所以大多数用户,始终对注册表有一种敬畏心理。

  照明灯:实际只要掌握了注册表的基本知识和“注册表编辑器”使用方法, 就能进行修改。尽管微软提供的资料不多,但从Google上搜索相关的关键字(如“修改注册表+去掉快捷方式小箭头”)就能找到相应的注册表位置。

  误区2.注册表=注册表编辑器

  这可能是最让混淆的概念了,很多人都认为“注册表”和“注册表编辑器”是一种东西。

  菜鸟A:“什么是Windows注册表呢?”

  菜鸟B:“这个我知道,不就是regedit.exe吗?依次点击“开始-运行”,输入regedit.exe打开的就是注册表啦!”

  菜鸟A:“哦,原来是这样。不过用regedt32.exe不是也能改注册表吗?难道有2个注册表?”

  照明灯:注册表是一个保存系统、软件设置数据的数据库,而“注册表编辑器”只是对于整个系统的读取/修改工具。这种概念的错误就好比你将记录营业额的Excel表格于打开此表格的Excel软件都称作“营业额表格”。在Windows 9X/2000中,regedit.exe和regedt32.exe是两个程序,其中的regedt32.exe无法进行REG文件的导入,也无法在DOS(16位状态)下运行;而在Windows XP中,使用regedit.exe和regedt32.exe打开的其实是同一程序,regedt32.exe的功能只不过是调用regedit.exe。

  误区3.系统的永动机----无限提升系统性能

  刚才说道在注册表中存放了系统的软硬件设置数据,也就是说,只要修改得当,能在一定程度提升系统性能,有些朋友刚学会修改注册表,就以为修改注册表可以无限的提升系统性能,并且因此频繁修改注册表。

  照明灯:适当的修改注册表可以提升系统性能,但这种提升是以硬件为基础的,只有当操作系统本身的设置相对硬件系统来说比较保守时,我们才有可能通过修改相关设置来发掘硬件本身潜能,试系统得到优化。但如果硬件本身就不怎么样,通过修改注册表来提升系统性能便只能成为一种奢望。如果真能这样大家就不必掏银子升级旧机器了,只需改改注册表就行了。

  误区4.舍近求远

  先来看一个例子:在Windows XP中,默认启动的“分组相似任务栏按钮”功能可以使原来日益拥挤的任务栏变的宽敞起来,可是用惯了Windows 98/2000的用户可能会觉得不习惯,想要禁用这个功能,有些朋友就会自然的想到寻找注册表中的修改位置,最后好不容易遭到了注册表中禁用此功能的方法:打开“注册表编辑器”,找到HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced,将其下的“TaskbarGlomming”键值改为0来达到目的。其实系统本身已经提供了相应的设置方法,只需要右键单击任务栏空白处,并选择“属性”,然后在“任务栏属性”窗口中去除“分组相似任务栏按钮”的勾选即可。

  照明灯:从这个例子就可以看出,其实在注册表中的绝大多数选项,Windows本身就提供了直观的修改方法。如果同样能达到目的的,又何必舍近求远呢?很多网站提供的技巧中都包含此类“伪技巧”。有一个简单的识别方法:在网上搜索到了注册表的修改位置后,打开“注册表编辑器”检查这个注册表位置中对应的选项键值是否存在,如果不存在需要新建则多数是真的,而如果已经存在了,则很有可能在系统中已经提供了相应的设置功能。

  三个疑问让你认清注册表的真面目

 

  1.为什么一定要使用注册表

  或许你会问,注册表既复杂,修改不当又容易引发系统故障,而DOS或早期的Windows没有注册表却也能正常工作,那么现在的Windows一定需要注册表呢?

  DOS是一个纯命令操作平台,没有图形界面,一切输入均通过命令的方式来解决。要打开文本文件1.txt需要输入“edit 1.txt”命令才行,也就是说“要打开什么文件”,“用什么程序打开此文件”这些问题都必须由你来告诉计算机。而现在的Windows系统中,要打开1.txt的属性只需在“资源管理器”双击此文件即可,你只要指定要打开的文件,计算机就会根据你要打开的文件类型自动选择合适的应用程序进行操作,这种智能的打开方法就是由注册表中保存的“文件关联”数据(出了“文件关联”外,注册表还存放了其他很多重要的设置数据)。这种发展是由计算机的复杂性决定,在DOS时代可能无需这种机制,但如果现在Windows没有“文件关联”,那成千上万种文件类型一定会让你看眼花。

  2.注册表的“妈妈”是谁

  Windows设计之初,并没有采用注册表这种方式来存放软硬件配置信息,而是使用了两个扩展名为INI的文件(system.ini和win.ini)。对于INI文件大家应该很熟悉了,很多“绿色软件”都声称其不在注册表中写入任何数据,但大多会在其安装目录下留下一个或几个INI文件。既然当初使用的是INI,为什么后来又改成注册表了呢?这是因为INI文件有一个致命的弱点就是大小不能超过64KB,随着软硬件功能的日益进步,其所需的配置数据体积也在不断膨胀,INI文件早已无法满足这种数据量的要求了。另外INI其实是依据某种定义规范的文本文件,编辑过程极易出错并由此导致系统故障,为了克服这些问题,在Windows 95及其后的版本中,Window系统都无一例外的采用了注册表机制,并将原来由多个INI组成的软硬件配置信息统一到了一起,形成一个数据库,那就是注册表。

  3.注册表的家在哪里

  既然注册表是一个数据库,那么这个数据库文件在那里呢?其实,难怪不少刚接触电脑的朋友误以为regedit.exe就是注册表,这是由于对注册表数据库的组成不清楚而造成的。Windows 98注册表的数据文件主要由System.dat和User.dat这两个文件组成,并保存在C:\Windows目录下,其中System.dat存储的是系统和硬件相关的配置,而User.dat则保存软件配置和用户配置,Windows 2000/XP注册表的数据文件主要存储在%Windir%\System32\config目录中的Default,Sam,Security,System,software和Userdiff等6个文件中,除此之外,还有部分数据保存在用户的配置文件目录中,比如Window 2000/XP中的Administrator的部分注册表数据就保存在C:\Documents and Settings\Administrator目录的Ntuser.dat文件中,所以只需要Administrator登陆系统后其目录下的NTUSER.DAT就不能被删除,因为它已经被加载到注册表中了。

  两个知识点理清错综复杂的注册表脉络

  1.查查注册表元素的身份证

  运行regedit.exe打开“注册表编辑器”,就能在其左侧看到注册表的分支结构,其中以文件夹方式表示的称为“键”,而在选中一个键后在窗口右侧显示的则称为“项”。在网上搜索到的修改教程中经常会提到“根键”,“主键”,“子键”,“键值项”,是什么意思呢?

  ①根键(Root Key)是指在注册表编辑器左侧以“HKEY”作为名称前缀的位置,因其位于注册表最项层被称为根键,如Windows XP的注册表中包括五大根键,分别为HKEY_CLASSES_ROOT,HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE,HKEY_USERS和HKEY_CURRENT_CONFIG。这些根键都可所写的,譬如HKEY_CLASSES_ROOT就可以简写为HKCR,其它的则以此类推。

  ②主键(Main Key)是指根键下面于根键最近的键,主键通常包括一个或多个子键或键值,如图中HKEY_LOCAL_MACHINE包括5个主键。

  ③子键(Sub Key)的位置是相对的,并不固定。某个键下面包含的另一个键则称它为前者的子键。但主键则不能称为根键的子键,这种以相对位置关系来命名的方式不能用于根键和主键。

  ④键值项(Value entry)是指显示在“注册表编辑器”右侧的项目,每个键值项包括名称,类型和数据三部分。键值项的名称可以由任意字符,数字,代表符和空格组成,但不能使用反斜杠。不同键值,主键和子键的键值项可以同名,但同一键中的键值项不能同名。键值项所定义的内容即为该键值项的值(即“键值”),其中最多能存放64KB的数据。值的数据类型可以是字符串,二进制值,DWORD(双字节)值等。

  小提示:上面的描述方法较为规范,平时我们还习惯将“子键”称为“分支”,而将“键值项”简称为“项”,这些称谓没有本质区别,只是叫法习惯不同罢了。

  2.真正的根键只有两个

  Windows 98的注册表有6个键值,而Windows 2000/XP/2003系统的根键数则是5个,但这些根键中只有HKEY_LOCAL_MACHINE和HKEY_USERS是真正的注册表键,其它几个键值都是从这两个根键的某个分支映射出来的,相对于这两个根键深层分支的一个快捷方式或者别名,主要是为了方便用户操作。

  ⑴HKEY_LOCAL_MACHINE

  这个根键存储的是安装在当前计算机上的硬件和软件配置信息,比如硬件设备的驱动程序,特定软件设置和Windows系统安装配置等数据。这些信息对当前系统中的所有用户均保持一致。这个根键下面还有5个重要的主键,其中Software和System最为关键,平时对系统进行相关调整大多集中在这两个键上。

  ①Software子键:保存于这台电脑中安装的应用程序和相关的设置,许多应用程序都使用该键值保存特定设置。关于Windows的许多设置都存在于HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion中。

  ②System子键:在这里精确的确定了Windows所装载的设备驱动程序和服务,以及当Windows启动时所使用的各种参数(如在网络上的计算机名称和当前硬件配置恩见)。

  ⑵HKEY_USERS

  HKEY_USERS包含有电脑特定用户的配置数据,Windows在此根键下的一个子键中为登陆该电脑的每个用户存储配置数据。如果电脑只有一个用户使用,那么所看到的就是单独一个子键,称为“.DEFAULT”

  而HKEY_USERS\S-1-5-21-1078081533-1202660629-1343024091-500(不同的电脑不一样)则是当前登陆用户的配置数据,其中S-1-5-21-1078081533-1202660629-1343024091-500就是这个目前登陆用户的SID,每一个网络上的用户都被域用户管理器分配了一个SID,每个SID是唯一的,所以它依赖于登陆用户,其分支数据是从用户配置文件的Ntuser.dat文件调出的。

  3.改头换面我也认识你

 

  前文提到只有HKEY_LOCAL_MACHINE和HKEY_USERS是才真正的注册表键。也就是说如果更改了其它别名分支中的某个键或键值,那么在HKEY_LOCAL_MACHINE和HKEY_USERS也会做出相应更改,通常我们还可将它们称为“别名”,下面是这些别名的实际位置:

  ①HKEY_CLASSES_ROOT--HKEY_LOCAL_MACHINE\SOFTWARE\Classes的别名。包含有文件类型和程序之间的关联。

  ②HKEY_CURRENT_USER--HKEY_USERS一个分支别名,该分支包含有当前登陆用户的配置数据,如果是单一用户HKEY_CURRENT_USER则指向HKEY_USERS\.DEFAULT

  ③HKEY_CURRENT_CONFIG

  --HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Hardware Profiles\Current的别名,其中ControlSet001还有可能是ControlSet000,ControlSet002等,它包含当前的硬件配置。

  附表1 HKEY_USERS部分重要分支说明

  .DEFAULT\AppEvents ------- 列出了事件相应,描述和各种系统功能的声音

  .DEFAULT\Console ------- 保存了MS-DOS窗口的选项,布局,荧屏颜色和字体设置

  .DEFAULT\Control Panle ------- 所有在控制面板里配置设置的信息全保存在这个键和它的子键中

  .DEFAULT\Environment ------- 保存了环境变量设置,特定的临时文件位置

  .DEFAULT\Keyboard Layout ------ 保存的是键盘布局设置,其中默认设置是美国传统键盘布局

  .DEFAULT\Software ------保存软件的安装设置,缺省用户只有微软生产的软件的设置

  SID\Network ------ 所有连接到其他系统的映射配置

  SID\Printers ------ 所有安装,共享和连接的打印机配置

  SID\Sofeware ------单独的用户扩展,基于为用户或者被用户安装的其他软件。

  附表2

  HKEY_CLASSES_ROOT

  配置单元包含的子项,列出了当前已计算机上注册的所有COM服务器和与应用程序相关的所有文件扩展名。

  HKEY_CURRENT_USER

  保存着当前登陆到由这个注册表服务的计算机机上的用户配置文件,其中子项包含环境变量,个人程序组,桌面设置,网络连接,打印机和应用程序首选项

  HKEY_LOCAL_MACHINE

  保存操作习用及硬件相关信息的配置单元,是一个公共配置信息,与具体用户无关

  HKEY_USERS

  包含的子项,含有当前计算机上所有的用户配置文件

  HKEY_CURRENT_CONFIG

  包含的子项,列出了计算机当前会话的所有硬件配置信息

  HKEY_DYN_DATE

  包含系统硬件的当前状态,也包含了那些需要更新和检索的数据,此键只存在于Windows 98/ME 系统中。

posted on 2008-01-12 15:16 谭文政 阅读(395) 评论(0)  编辑 收藏 引用 所属分类: windows 编程

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理