2012-01-28 9 views
3

私は基本的にこのコードと同じ機能を実行したいのですが、C.レジストリにアクセスしてC(C#コードの例)のキーをループするにはどうすればよいですか?

RegistryKey regAdapters = Registry.LocalMachine.OpenSubKey (AdapterKey, true); 
    string[] keyNames = regAdapters.GetSubKeyNames(); 
    char[] devGuid; 
    foreach(string x in keyNames) 
    { 
     RegistryKey regAdapter = regAdapters.OpenSubKey(x); 
     object id = regAdapter.GetValue("ComponentId"); 
     if (id != null && id.ToString() == "tap0801") devGuid = regAdapter.GetValue("NetCfgInstanceId").ToString(); 
    } 
+0

再帰はどこですか? RegEnumKeyExの単純なケースのように見えます。 –

+0

行4:foreach(keyNamesの文字列x) – liamzebedee

+2

これは再帰ではありません。これは文字列配列のループです。 Cでは、RegEnumKeyExと呼ばれるwhileループがあります。前にapiプログラミングに勝ったことはありますか? –

答えて

5

にそこには再帰が実際にありません。このコードは、HKLMの下でキーを開き、すべてのサブキーを列挙し、特定の名前付き値を探します。概要では、あなたのCコードは、これらのWin32 API呼び出しから作成されます。

HKEY hRegAdapters; 
LONG res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AdapterKey, 0, 
    KEY_READ, &hRegAdapters); 
// error checking by testing res omitted 

今、あなたが鍵を開けていることをあなたがサブキー列挙することができます:今、あなたはの名前を持っていることを

for (DWORD Index=0; ; Index++) 
{ 
    char SubKeyName[255]; 
    DWORD cName = 255; 
    LONG res = RegEnumKeyEx(hRegAdapters, Index, SubKeyName, &cName, 
     NULL, NULL, NULL, NULL); 
    if (res != ERROR_SUCCESS) 
     break; 
    // do something with Name 
} 

を各サブ鍵は、あなたがRegGetValueで値を読み取ることができます。

char Value[64]; 
DWORD cbData = 64; 
LONG res = RegGetValue(hSubKey, SubKeyName, "ComponentId", 
    RRF_RT_REG_SZ, NULL, Value, &cbData); 
// check for errors now before using Value 

RegGetValueはVistaで追加の便利な機能です。 XP上でコードを実行する必要がある場合は、代わりにRegQueryValueExに電話する必要があります。まずサブキー"ComponentId"を開きます。

すべてのエラーチェックを省略し、Unicodeの問題を無視してANSI APIを呼び出したことに注意してください。私はあなたにすべての詳細を残します。

完了したらRegCloseKey(hRegAdapters)に電話することを忘れないでください。

レジストリへのアクセス方法の詳細については、MSDN documentationを参照してください。

+0

ありがとう、これは私の現在のコードよりも効率的です。 – liamzebedee

関連する問題