0

特定のキー パスでレジストリ キーの値を検索するコードがあります。レジストリ キーで、レジストリ キーの最後にある などのSYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318} すべてのキーを見つけます。. 各キー (たとえば) には、次のように、ネットワーク インターフェイス カードの ID 値を保持するサブキーが呼び出されます。値が見つかった場合、メソッドはキー パスを返します。問題はエラーです0000 , 0001 , 0002 , 0003{4D36E972-E325-11CE-BFC1-08002BE10318}0007NetCfgInstanceId{C80949A4-CEDA-4F29-BFE2-059856D7F745}Cannot convert type 'char' to 'string'

foreach (string key_value in key.GetValue("NetCfgInstanceId").ToString())

完全なコードは

public string key_path(RegistryKey root, string root_path, string search_key)
{
    string path = string.Empty;
    foreach (string keyname in root.GetSubKeyNames())
    {
        try
        {
            using (RegistryKey key = root.OpenSubKey(keyname, true))
            {

                foreach (string key_value in key.GetValue("NetCfgInstanceId").ToString()) 
                {
                    if (key_value == search_key)
                    {
                        string reg_path = (string)key.GetValue("NetCfgInstanceId");
                        path = reg_path;
                    }
                    else
                    {
                        path = "Can't find key !";
                    }
                }
            }
        }
        catch (System.Security.SecurityException)
        {
            //Do nothing !!!
        }
    }
    return path;
}

private void kryptonButton4_Click(object sender, EventArgs e)
{
    var answer = key_path(Registry.LocalMachine, @"SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}", "{C80949A4-CEDA-4F29-BFE2-059856D7F745}");
    MessageBox.Show(answer);
}       

この問題をどのように解決できますか?

4

1 に答える 1

1

Foreach は列挙可能な値を取ります。その値として文字列を使用しているため、コンパイラは foreach に文字変数を必要とします。つまり、GetValue(...).ToString() への呼び出しは文字列の配列を返さず、1 つの文字列を返します。foreach( var x in stringval )、var は char です。

代わりにこのようなものを検討してください...

var kind = key.GetValueKind("NetCfgInstanceId");
if (kind == RegistryValueKind.MultiString)
{
    foreach (var key_value in (string[])key.GetValue("NetCfgInstanceId"))
    {
        if (key_value == search_key)
        {
            string reg_path = (string)key.GetValue("NetCfgInstanceId");
            path = reg_path;
        }
        else
        {
            path = "Can't find key !";
        }
    }
}

これは、reg キーに複数文字列が含まれていることを前提としています。単一の文字列である可能性がある場合は、次を使用できます...

if (kind == RegistryValueKind.ExpandString
   || kind == RegistryValueKind.String)
{
    var key_value = (string)key.GetValue("NetCfgInstanceId");
    if (key_value == search_key)
    {
        path = key_value;
    }
    else
    {
        path = "Can't find key !";
    }
}
于 2012-07-30T18:32:15.773 に答える