C#RegistryKey.GetValue不返回空行

时间:2012-10-31 19:34:42

标签: c# winapi registry

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

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

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

当我在C#4.0中使用RegistryKey.GetValue查询此值时,我只得到string[]只有一个元素:

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

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

在除空行之外的所有内容中,它返回与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;
    }

1 个答案:

答案 0 :(得分:2)

Double null终止字符串不能包含空行。尝试包含空行意味着包括两个连续的空值,并且被解释为终止而不是空行。 Raymond Chen discussed this quirk更加雄辩,我可以。

也许您可以保存到REG_SZ并使用Environment.NewLine作为分隔符。