所以我正在编写一些代码并使用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;
}
答案 0 :(得分:2)
Double null终止字符串不能包含空行。尝试包含空行意味着包括两个连续的空值,并且被解释为终止而不是空行。 Raymond Chen discussed this quirk更加雄辩,我可以。
也许您可以保存到REG_SZ
并使用Environment.NewLine
作为分隔符。