【问题标题】:C# RegistryKey.GetValue doesn't return blank linesC# RegistryKey.GetValue 不返回空行
【发布时间】:2012-10-31 19:34:41
【问题描述】:

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

我正在查询的 MultiString 有两行,: 和一个空行。 Regedit 为所述值的 reg 文件导出提供hex(7):3a,00,00,00,00,00。这是对的。 3a 将是:,然后是一个空值,两个空值表示空行,最后还有两个空值表示值的结束。我的代码给出了hex(7):3a,00,00,00,这将是: 和多字符串上的双空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;
    }

【问题讨论】:

    标签: c# winapi registry


    【解决方案1】:

    双空终止字符串不能包含空行。尝试包含空行意味着包含两个连续的空值,这被解释为终止而不是空行。 Raymond Chen discussed this quirk 比我能说的更雄辩。

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

    【讨论】:

    • 就是这样,regedit export 给出 hex(7):3a,00,00,00,00,00 作为输出,其中包含一个空行。它也可以被导入,并且导入也有效,创建的 MultiString 确实包含导出文件将指示的空行。
    • 您可以在其中粘贴任意数量的空值。一旦解析器连续遇到两个,它就认为列表已经终止。
    • 另外,我的问题是为什么 regedit export 给出 hex(7):3a,00,00,00,00,00 作为值(有效),而 RegistryKey.GetValue 只给出一个数组元素对于多字符串中的非空行。如果 regedit 可以创建正确包含双空的 .reg 文件,为什么 RegistryKey.GetValue 甚至在 MultiString 中没有该行的元素?
    • 就是这样,解析器没有。如果您将以下内容作为 .reg 文件导入,它确实会对其进行解析并在多字符串中放置一个空行:Windows 注册表编辑器版本 5.00 [HKEY_CURRENT_USER\test] "test"=hex(7):3a,00,00,00 ,00,00
    • 如果您在问题中输入格式错误的数据行,regedit 查看器将显示空行,但不会让您保存带有空行的多字符串。由于您将无效数据放入注册表中,我认为 regedit 可以随意解释它是合理的。规则是“没有空字符串”。如果您试图反对这一点,请期待痛苦。
    猜你喜欢
    • 1970-01-01
    • 2020-03-16
    • 2021-10-08
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 2020-08-17
    相关资源
    最近更新 更多