为什么需要Windows注册表?


56

当我并排调试com中的问题,处理dll地狱时,全神贯注地讨厌Windows注册表,我想知道为什么需要它。

我从未感到被迫阅读整本有关注册表最佳实践的书,然后仅仅“了解它”。

但是,我使用过Linux和Mac OS,并探讨了可以在同一台* nix计算机上安装多个版本的Python及其库的方法。

因为注册表有点像免费的(虽然很丑陋)格式,并且用于各种各样的目的,所以我从不了解它试图解决什么基本问题。

例如,Microsoft不希望您同时安装两个不同版本的MS Office。他们使用注册表在安装过程中强制执行此操作。我认为,这种限制是人为的。如果他们真的愿意允许其他行为,则可以相应地调整其体系结构。

在Mac OS中,您可以通过将应用程序拖放到特定文件夹中来安装和删除它们。

所以,

A)它试图解决什么基本问题?B)其他操作系统如何解决?


2
也可以通过在Windows上拖放来安装应用程序。Eclipse IDE是想到的第一个示例。我敢肯定还有其他人。注册表还用于配置操作系统的许多其他方面(我一直认为这是其存在的主要目的)和其他程序,并且还可以以各种有趣和有创意的方式滥用注册表。
FrustratedWithFormsDesigner

请参阅fun.drno.de/flash/howto_turn_windows_into_linux.swf 步骤2至4对Windows和Linux的这种配置数据进行了有趣的比较。;)
FrustratedWithFormsDesigner


3
你可以有办公室安装了两种版本所以,“限制”你提到的不仅仅是人工其虚构
康拉德Frix

1
@工作。我想我可以同意这一点,除了这个问题有一个可以接受的解决方案,一个注册表修复程序(具有讽刺意味的是,它不会丢失)是指并行运行2007/2003。您何时在遇到要同时运行两个Office安装的地方遇到此问题的?顺便说一句,这是用于并行运行XP和97 的KB
Conrad Frix 2011年

Answers:


42

其他大多数答案或多或少是正确的,但是(连同问题)它们有点错了。

注册表是一个分层的数据库管理器,仅此而已。

您要归因于注册表的“故障”实际上与注册表本身无关。它们只是各个供应商就如何安装程序等事情做出的决定-如果您以其他方式/表单/容器存储信息,则可能仍然存在相同的问题。

考虑到Unix的“一切都是文件”理念,Unix(以及类似的系统,例如Linux和MacOS)将信息存储为文件系统中的单个文件也就不足为奇了。但是,这几乎没有许多人可能立即想到的不同,因为Unix文件系统本身就是一个分层数据库(如果考虑符号链接,则可以说是网络数据库)。明显的区别在于,注册表是通过单独的API访问的,其中,将配置数据存储在文件中允许通过与其他任何文件相同的API(和工具)来访问,编辑这些文件。



11
@Conrad Frix:是什么让您认为ACID事务或查询语言必然是数据库的一部分?
杰里·科芬

1
@Jerry,当然。我在那里同意你的看法。但是(正如康拉德的评论所证明的那样),许多人倾向于假设某些有关“数据库”属性的事情,所以我想我的调解尝试只是输了。
妮可

1
@Conrad Frix:当然,某些文件系统不是分层的。但是,我并不是说Unix FS 比其他FS具有更高的层次结构-NTFS(例如)也是如此。
杰里·科芬

3
@JBRWilkinson:事情倒退了。还有其他组件依赖于注册表中的硬编码位置(就像Unix上的某些组件依赖于硬编码文件路径一样)。但这并不会改变注册表的含义或作用。
杰里·科芬

25

这是一个设置存储库 - 一个集中的,有点标准化的位置,用于显示首选项,设置和轻量级配置文件

当您从全局上了解操作系统必须为其用户和应用程序存储的所有内容时,将更容易理解:

视窗

  • 设置存储库
    • 系统: Windows注册表HKEY_LOCAL_MACHINE,尤其是其中的大部分\SOFTWARE\Microsoft
    • 第三方系统范围: Windows注册表HKEY_LOCAL_MACHINE
    • 以用户为中心的系统: Windows注册表HKEY_USERS[user]\SOFTWARE\Microsoft
    • 以第三方用户为中心: Windows注册表HKEY_USERS\[user]\SOFTWARE
  • 用户不需要 C:\Users\[User]\AppData在隐藏文件夹中查看的应用程序文件
  • 用户可能需要 C:\Users\[User]\在应用程序创建的非隐藏文件夹中的应用程序文件

Mac OS X

  • 设置存储库
    • 系统和第三方: /Library/Preferencescom.apple...plist文件中
    • 系统范围 /Library/Preferences内的第三方在第三方plist文件中
    • 以用户为中心的系统: /Users/[user]/Library/Preferences,与上述相同
    • 以第三方用户为中心: /Users/[user]/Library/Preferences,与上述相同
  • 用户不需要查看的系统范围的应用程序文件 /Library/Application Support
  • 用户不需要查看的应用程序文件 /Users/[user]/Library/Application Support
  • 用户可能需要 /Users/[user]/在非隐藏文件夹中的应用程序文件

本质上,注册表与Mac OS X的 文件夹相同/Library/Preferences ,但不多或少。

Mac OS与组织的系统和应用程序数据组几乎一对一匹配,这一事实说明Windows Registry是一个完全合理的系统,只是一种不同的处理方式

注册表的非文件系统性质确实使备份,还原或迁移其中的一部分变得困难,同时又留下了其他部分,因此我确实更喜欢Mac系统,但目的几乎相同。

两种操作系统都有选择不同程度违反这些结构的应用程序,通常是通过篡改一些全局性上下文来创建不真正属于该结构的文件或文件夹。有些应用程序实际上创建文件夹,直入C:\/不问。那真让我发疯!


顺便说一句,尽管(大多数)Mac OS应用程序的拖放特性非常出色,但是并排使用不同的版本也会遇到类似的问题,尽管您可能不会注意到-因为未保存设置在该.app文件本身,但Application Support还是Preferences,应用程序将仍然使用相同的设置和相互影响,除非新版本明确决定一个不同的名称使用文件夹中的每个版本(IntelliJIDEA70IntelliJIDEA81,等)


的确,注册表最初是作为设置存储库开始的,可以替代INI文件,但是如今,它通常被用作常规数据存储,因此hi肿了。
Synetech

20

我从未理解过它试图解决什么基本问题。

在注册表之前,Windows使用.INI文件。在博客文章中,为什么不赞成使用INI文件来支持注册表?Raymond Chen枚举了试图解决的.INI文件所存在的问题。他还列举了XML配置文件与旧.ini文件共享的问题。这可能是值得一看的,因为这是当今许多应用程序所使用的。

...钟摆又回到了文本配置文件,但是这次是XML。这重新打开了INI文件所存在的许多问题,但是您的主要优势是没有人可以写入XML配置文件。他们只从他们那里读。XML配置文件不用于存储用户设置。它们仅包含有关程序本身的信息。让我们再次看看这些问题。

  • XML文件的安全性不够精细。但是,由于XML配置文件是只读的,因此主要的反对意见得以回避。(但是,如果您只希望管理员具有读取XML特定部分的权限,那么您就会遇到麻烦。)
  • 由于XML配置文件是只读的,因此您不必担心多个编写器。
  • XML配置文件可能会遭受拒绝服务。您仍然可以独占打开它们并锁定其他进程。
  • XML文件仅包含字符串。如果要存储二进制数据,则必须以某种方式对其进行编码。
  • 解析XML文件相对较慢。但是由于它们是只读的,因此您可以安全地缓存已解析的结果,因此只需要解析一次即可。
  • 程序手动解析XML文件,但是XML格式已被锁定,因此即使您想要扩展它也无法扩展。希望这些程序使用符合标准的XML解析器而不是滚动使用自己的XML解析器,但是如果人们编写了自己的自定义XML解析器来处理例如长度超过70个字符的指令或字符串,我就不会感到惊讶。
  • XML文件没有大小限制。
  • XML文件没有默认位置。

所有这些都假定应用程序确实确实不会向我不同意的配置文件中写入内容,但这会使情况变得更糟。


2
具有讽刺意味的是,由于“可移植性”本身的普及,由于闪存驱动器的流行,许多应用程序现在完全完全放弃了注册表,而再次支持INI文件(对于XML则不是那么多)。
Synetech

11

我的理论是以上都不是推动力。相反,这是一项反盗版措施。在注册前的日子里,您通常可以简单地将整个程序从一台计算机复制到另一台计算机。找到.DLL,您一切顺利。注册表使得这MUCH更难做。

注册表完成的工作很少,我认为只有一种配置文件可以更好地满足每个目的。

(2014)在这里进一步说明一下:我将注册表视为上帝的对象。我们都知道这是一种反模式。


7
因此,微软专门创建了一些限制用户可以轻松执行的操作?...听起来不错。
dan_waterworth 2011年

绝对是反模式。有趣的想法。
布拉德·托马斯

有趣的观点,但是在引入注册表时,仍然是DOS + Windows时代,由于硬件可访问性,盗版者与版权保护之间的战争达到了顶峰,并产生了很多不可思议的事情。当时不太可能有人在注册表上进行版权保护。
Codism

6

我的粗略理解是,注册表被设计为一种设置存储库,取代了以前使用的.ini文件。

(注意,粗略的理解,所以这很可能是不正确的)。


5

答:我同意蒂姆的回答。

B)其他操作系统使用其他存储程序设置的方法,例如,Unix通常将文件放置在/ etc(全局文件)中以及用户文件夹中的各种隐藏文件夹中(用户设置)。因此,他们都使用某种形式的注册表,只是在某些情况下是分布式的。


3

据我了解(不一定喜欢)

A)提供一个“集中位置”,任何程序都可以在其中存储有关其安装或设置的信息。然后,程序可以通过任何决定使用此信息。定制,反盗版等

所有这些信息都以这种结构进行保护,想到动物聚集在一起的想法,数量上更加安全。如果信息的每一位都是其自己的ini文件,则某些用户可能会一时兴起将其删除。他们仍然可以通过进入注册表来做到这一点,但许多人将其视为黑匣子,并且不会碰它,因为担心会破坏他们的系统。

B)Mac OS使用单个文件,就像在出现注册表之前使用的ini文件窗口一样。


3

注册表的明显目的是充当所有配置和设置数据的单一存储库,并消除对配置文件的依赖。

在其他操作系统上,操作方法是将特定于应用程序的信息(例如配置文件)存储到用户主目录中隐藏的特定于应用程序的目录中。(例如,游戏Aquaria在中存储配置信息$HOME/.Aquaria。)全局设置文件存储在中/etc/

Mac做自己的事:特定于应用程序的plist文件(我相信)存储在用户或系统的Library目录中。


3

问题不在于注册表的原理,而在于设计。操作系统使用注册表来查找有关正在加载的程序的重要信息。尽管不是在需要时加载信息,而是在引导时加载所有信息,这“会”影响系统的性能。由于供应商向系统加载了大量信息,并且很多时候他们在卸载软件时不删除信息,因此该系统也被彻底滥用。

与Unix不同,在Unix中,所有内容均存储n个文件并在需要时加载。操作系统以这种方式不依赖供应商编程技能来影响其性能...


2

尽管我无法在其他操作系统上发表评论,但注册表还有助于在升级或卸载/重新安装过程中维护应用程序的配置。如果所有配置都位于一个.ini文件中,由于进行了添加功能的升级,该文件需要替换。您可能会遇到麻烦,或者必须创建一个自定义过程才能将配置数据合并到传入的ini文件中。

但是,通过注册表中的数据,您可以使用通用的安装程序包(WIX,InstallShield等),该程序包将处理文件的卸载/重新安装,而无需触摸应用程序设置。


1

(全部A。不确定B)

我认为这实际上可以归结为(历史)点,注册表充当应用程序设置的一种通用接口。

有申请吗?是否要存储用户范围的设置?在注册表中删除它。

无需“确保用户个人资料”,根本不需要直接访问文件系统。Win32会照顾所有这些。


1

对于大多数用户来说,这是一种创建新的,陌生的和忌讳的东西的方式,因此他们会不理会它。.ini和autoexec.bat文件可以很容易地删除或更改,更糟的是。

更改注册设置,天哪!


1

除了简单地存储应用程序设置外,注册表是程序和组件查找其他程序和组件的方法。最终,我认为这就是为什么将其集中到一个数据库中,而不是分散在成千上万个文本或xml文件中的原因。

例如,执行视频效果的组件会将其自身“注册”到注册表中,从而允许其他与视频相关的应用程序知道其存在并使用它。通过为此使用集中式系统,它避免了成千上万的混乱,因为成千上万的系统和应用程序使用不同的方法来实现该级别的集成。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.