区别:环境变量和注册表项

use*_*747 6 c++ registry winapi posix environment-variables

注册表项和环境变量有什么区别?

我认为环境变量只能在 Windows 操作系统中找到?我听说改变这些很容易,所以相信它们不好?注册表项是否很容易更改?

注册表项是否存储在内核中?

我最重要的问题是:我知道环境变量让我知道%APPDATA的路径、当前用户名、程序文件的路径、运行的Windows操作系统的版本等。但是注册表项也包含这种类型吗?数据 - 我也可以通过查看注册表项找到此信息吗?

Han*_*ant 6

两者都用于配置程序。最大的区别是环境变量存储在内存中,注册表项存储在文件中。这解释了它们的许多属性:

  • 一旦写入环境变量值的进程终止,它们就会丢失。
  • 一个进程无法更新另一个进程的环境变量值。但有一个重要的例外:进程的环境是由启动它的进程创建的。CreateProcess() 的 lpEnvironment 参数。这就是父进程配置其启动的子进程的方式。
  • 存储环境变量的空间受到严格限制,最大 64KB。
  • 环境变量不像注册表项那样具有用户范围,它们对于任何用户都具有相同的值,除非父进程明确处理它。
  • 无法保护环境变量值。
  • 访问环境变量很快。需要注意的是,搜索变量是一个 O(n) 操作,因为它们没有分层组织,也没有索引。有限的环境规模使得没有必要这样做。然而,Windows 极大地优化了注册表项访问。


Yoc*_*mer 4

另一个重要的区别:

环境变量在进程启动时加载到进程中。因此,如果您在进程运行后更改它们,该进程将看不到这一点。

关于你的另一个问题:

用户变量:HKEY_CURRENT_USER\Environment

系统变量:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

关于默认系统变量的文章:

http://vlaurie.com/computers2/Articles/environment.htm