2

関数はどの順序RegistryKey.GetSubKeyNamesでサブキーを返しますか? それらはアルファベット順ですか?それとも、レジストリ内のストレージに対応するランダムな順序になっていますか?

複数の検索を行い、MSDN を確認しましたが、決定的な答えは見つかりませんでした。理想的には、MSDN は、キーがソートされていることを述べているか、その順序がランダムであることを明示的に述べています...

私が知りたい理由は、レジストリ内の COM クラスのすべてのバージョンを検出するコードを書きたいからです。<base-name>13、<base-name>14 などの名前が付けられます。キーが並べ替えられている場合は、最初に一致するものを見つけて、検索に一致するすべてのものを反復処理し、短絡することができます。キーが検索に一致しなくなったら。そうすれば、すべてのサブキーをループする必要はありません。

4

3 に答える 3

0

文書化されていない場合、何かを推測できないことに同意しますが、多くの場合、文書が間違っている、古い、または存在しない可能性があります。

したがって、JetBrains で dotPeek を使用し、mscorlib.dll を調べると、次のコードが SubKeyNames をプルするために使用されていることがわかります。

[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

これはあなたの明確な答えです。

于 2018-01-03T20:28:24.577 に答える