0

所以我正在编写一些代码并使用RegistryKey.GetValue,我似乎无法让它返回正确的字符串数组。我会使用 RegSaveKeyEx,除非我需要在我正在创建的 reg 文件中更改密钥的保存位置。

我正在查询的 MultiString 有两行:和一个空行。Regedit 为hex(7):3a,00,00,00,00,00所述值的 reg 文件导出提供。这是对的。3a 将是:,然后是一个空值,两个空值用于空行,最后两个空值表示值的结束。我的代码是给hex(7):3a,00,00,00,这将是:多字符串上的 a 和双空 EOL 字符。当导入回注册表时hex(7):3a,00,00,00只有一个:,空行丢失。

如果我导入hex(7):3a,00,00,00,00,00然后在 regedit 中查看值,我会看到:一个空行。这是正确的,这就是我希望我的代码执行的操作。

当我RegistryKey.GetValue在 C# 4.0 中查询这个值时,我得到的 astring[]只有一个元素,:.

对于其他 MultiString 值,我得到一个包含每一行元素的数组,正如我所期望的那样。

RegistryKey.GetValue不会为空行返回任何内容。它不返回空值,数组中的空白字符串,什么都没有。

在除空行之外的所有内容上,它都返回与 regedit 导出完全相同的结果。需要改变什么让它返回一个包含空行的数组?

如果有帮助,这是我的代码:

private static string RegMultiStringExtraction(RegistryKey UsersSubKey, string Key)
    {
        string[] InputStrs = (string[])UsersSubKey.GetValue(Key, Environment.NewLine, RegistryValueOptions.DoNotExpandEnvironmentNames);
        StringBuilder sb = new StringBuilder();
        foreach (string str in InputStrs)
        {
            char[] Values = str.ToCharArray();
            foreach (char letter in Values)
            {
                int ValueInt = Convert.ToInt32(letter);
                sb.Append(ValueInt.ToString("x"));
                sb.Append(",00,");
                if (Values.Length == 0)
                {
                    if (sb.Length == 0)
                    {
                        sb.Append("00,");
                    }
                    else if (sb.Length > 1)
                    {
                        sb.Append(",00,");
                    }
                }
            }
            sb.Append("00,00,");
        }

        string Value = ('"' + Key.ToString() + @"""=" + "hex(7):" + sb.ToString().TrimEnd(','));
        return Value;
    }
4

1 回答 1

2

双空终止字符串不能包含空行。尝试包含空行意味着包含两个连续的空值,这被解释为终止而不是空行。Raymond Chen比我更雄辩地讨论了这个怪癖。

也许您可以保存REG_SZEnvironment.NewLine用作分隔符。

于 2012-10-31T19:49:50.497 回答