首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RegistryKey.GetSubKeyNames中元素的顺序

RegistryKey.GetSubKeyNames中元素的顺序
EN

Stack Overflow用户
提问于 2013-05-07 03:32:01
回答 3查看 715关注 0票数 2

函数RegistryKey.GetSubKeyNames返回子键的顺序是什么?它们是按字母顺序排列的吗?或者它们在注册表中的存储顺序是随机的吗?

我已经进行了多次搜索,并检查了MSDN,但我还没有找到一个明确的答案。理想情况下,MSDN会声明键是按顺序排序的,或者显式地声明它们的顺序是随机的……

我想知道的原因是,我想编写代码来检测注册表中COM类的所有版本。如果关键字被排序,我可以只找到第一个匹配的关键字,遍历所有匹配我的搜索的关键字,一旦关键字不再匹配我的搜索,我就会跳过。这样我就不必遍历所有的子键了。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-07 04:07:00

由于文档不保证任何特定的顺序,因此您不能假定任何特定的顺序。如果你需要一个特定的订单,你必须自己排序。(顺序不是随机的,但也不排序。)

票数 5
EN

Stack Overflow用户

发布于 2020-07-22 10:45:41

我不能说这是一个明确的答案,但当我试图回答同样的问题时,我得出的结论是这是存储顺序,即FIFO或自然顺序。

我使用过的所有注册表编辑器都按字母顺序对键和值名进行排序。这不是自然的顺序。我认为HKLM\Software\Microsoft\Windows\CurrentVersion\Run.的自然顺序是通过RegScanner来实现的

除了删除键中的所有值,然后按字母顺序放回它们之外,我不知道有什么方法可以使自然顺序与字母顺序相匹配。但是,如果稍后添加一个新值,则此顺序将被打破,因为该新值将添加到末尾。

票数 1
EN

Stack Overflow用户

发布于 2018-01-04 04:28:25

我同意你不能假设没有文档的东西,但很多时候文档可能是错误的,过时的,或者不存在的。

因此,当通过JetBrains使用dotPeek并查看mscorlib.dll时,我们看到以下代码用于拉取SubKeyNames:

代码语言:javascript
复制
[SecuritySafeCritical]
Public String[] GetSubKeyNames()
{
  this.CheckPermission(RegistryKey.RegistryInternalCheck.CheckKeyReadPermission, (String) null, False, RegistryKeyPermissionCheck.Default);
  Return this.InternalGetSubKeyNames();
}

[SecurityCritical]
internal unsafe String[] InternalGetSubKeyNames()
{
  this.EnsureNotDisposed();
  Int length1 = this.InternalSubKeyCount();
  String[] strArray = New String[length1];
  If (length1 > 0)
  {
    Char[] chArray = New Char[256];
    fixed (Char* lpName = &chArray[0])
    {
      For (Int dwIndex = 0; dwIndex < length1; ++dwIndex)
      {
        Int length2 = chArray.Length;
        Int errorCode = Win32Native.RegEnumKeyEx(this.hkey, dwIndex, lpName, ref length2, (Int[]) null, (StringBuilder) null, (Int[]) null, (Long[]) null);
        If (errorCode != 0)
          this.Win32Error(errorCode, (String) null);
        strArray[dwIndex] = New String(lpName);
      }
    }
  }
  Return strArray;
}

因此-订单将始终使用RegEnumKeyEx函数。我们可以看到“因为子键没有排序,所以任何新的子键都会有一个任意的索引。这意味着函数可以以任何顺序返回子键。”

https://msdn.microsoft.com/en-us/library/windows/desktop/ms724862(v=vs.85).aspx

这就是你的确切答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16405858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档