2011-11-15 3 views
0

- 列挙レジストリサブキー:列挙レジストリサブキー

http://msdn.microsoft.com/En-US/library/ms724256.aspx

// QueryKey - Enumerates the subkeys of key and its associated values. 
//  hKey - Key whose subkeys and values are to be enumerated. 

#include <windows.h> 
#include <stdio.h> 
#include <tchar.h> 

#define MAX_KEY_LENGTH 255 
#define MAX_VALUE_NAME 16383 

void QueryKey(HKEY hKey) 
{ 
    TCHAR achKey[MAX_KEY_LENGTH]; // buffer for subkey name 
    DWORD cbName;     // size of name string 
    TCHAR achClass[MAX_PATH] = TEXT(""); // buffer for class name 
    DWORD cchClassName = MAX_PATH; // size of class string 
    DWORD cSubKeys=0;    // number of subkeys 
    DWORD cbMaxSubKey;    // longest subkey size 
    DWORD cchMaxClass;    // longest class string 
    DWORD cValues;    // number of values for key 
    DWORD cchMaxValue;   // longest value name 
    DWORD cbMaxValueData;  // longest value data 
    DWORD cbSecurityDescriptor; // size of security descriptor 
    FILETIME ftLastWriteTime;  // last write time 

    DWORD i, retCode; 

    TCHAR achValue[MAX_VALUE_NAME]; 
    DWORD cchValue = MAX_VALUE_NAME; 

    // Get the class name and the value count. 
    retCode = RegQueryInfoKey(
     hKey,     // key handle 
     achClass,    // buffer for class name 
     &cchClassName,   // size of class string 
     NULL,     // reserved 
     &cSubKeys,    // number of subkeys 
     &cbMaxSubKey,   // longest subkey size 
     &cchMaxClass,   // longest class string 
     &cValues,    // number of values for this key 
     &cchMaxValue,   // longest value name 
     &cbMaxValueData,   // longest value data 
     &cbSecurityDescriptor, // security descriptor 
     &ftLastWriteTime);  // last write time 

    // Enumerate the subkeys, until RegEnumKeyEx fails. 

    if (cSubKeys) 
    { 
     printf("\nNumber of subkeys: %d\n", cSubKeys); 

     for (i=0; i<cSubKeys; i++) 
     { 
      cbName = MAX_KEY_LENGTH; 
      retCode = RegEnumKeyEx(hKey, i, 
        achKey, 
        &cbName, 
        NULL, 
        NULL, 
        NULL, 
        &ftLastWriteTime); 
      if (retCode == ERROR_SUCCESS) 
      { 
       _tprintf(TEXT("(%d) %s\n"), i+1, achKey); 
      } 
     } 
    } 

    // Enumerate the key values. 

    if (cValues) 
    { 
     printf("\nNumber of values: %d\n", cValues); 

     for (i=0, retCode=ERROR_SUCCESS; i<cValues; i++) 
     { 
      cchValue = MAX_VALUE_NAME; 
      achValue[0] = '\0'; 
      retCode = RegEnumValue(hKey, i, 
       achValue, 
       &cchValue, 
       NULL, 
       NULL, 
       NULL, 
       NULL); 

      if (retCode == ERROR_SUCCESS) 
      { 
       _tprintf(TEXT("(%d) %s\n"), i+1, achValue); 
      } 
     } 
    } 
} 

void __cdecl _tmain(void) 
{ 
    HKEY hTestKey; 

    if(RegOpenKeyEx(HKEY_CURRENT_USER, 
     TEXT("SOFTWARE\\Microsoft"), 
     0, 
     KEY_READ, 
     &hTestKey) == ERROR_SUCCESS 
    ) 
    { 
     QueryKey(hTestKey); 
    } 

    RegCloseKey(hTestKey); 
} 

どのように私がそのコードを変更することができます。すべてのコンソールに出力する

cchValue = MAX_VALUE_NAME; 
      achValue[0] = '\0'; 
      retCode = RegEnumValue(hKey, i, 
       achValue, 
       &cchValue, 
       NULL, 
       NULL, 
       NULL, 
       NULL); 

      if (retCode == ERROR_SUCCESS) 
      { 
       _tprintf(TEXT("(%d) %s\n"), i+1, achValue); 
      } 

RegEnumValue関数が返す値、 はmsdnで機能します。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms724865%28v=vs.85%29.aspx 私はあまりにもこれらのVARS出力したい:私は別のものを試してみました

__out  LPTSTR lpValueName, 
    __inout  LPDWORD lpcchValueName, 
    __out_opt LPDWORD lpType, 
    __out_opt LPBYTE lpData, 
    __inout_opt LPDWORD lpcbData 

しかし、毎回私は機能する からNULLのVARのいずれかを変更します、

RETCODE = RegEnumValue(HKEY、I、 achValueを& cchValue、 NULL、 NULL、 NULL、 NULL);

私も、レジストリで動作する.NET Frameworkのクラスを使用しないのはなぜachValueに

おかげでたくさん

PD窓7の64ビットを使用してのVisual Studio 2010究極

答えて

1

4つのNULL値の最初はlpReservedあり、NULLに設定されなければなりません。

もう1つはlpTypeであり、それ自体を取得できるはずです。

3番目と4番目はペアになっているため、NULLに設定するか、両方とも非NULLにする必要があります。それらは、achValuecchValueのように機能します。最初はデータを受け取るバッファ、2番目はバッファのサイズを持っていなければならないサイズへのポインタで、次にデータのサイズで埋められます。

次のコード私のVistaマシン上で動作します:レジストリサブキーを列挙して問題を有する他の人を助けるために

 const DWORD maxValueBytes=300; 
     BYTE valueBytes[maxValueBytes]; 
     DWORD valueSize=maxValueBytes; 
     DWORD valueType=0; 
     cchValue = MAX_VALUE_NAME; 
     achValue[0] = '\0'; 
     retCode = RegEnumValue(hKey, i, 
      achValue, 
      &cchValue, 
      NULL, 
      &valueType, 
      valueBytes, 
      &valueSize); 

     if (retCode == ERROR_SUCCESS) 
     { 
      _tprintf(TEXT("(%d) %s (%d - %d bytes)\n"), i+1, achValue,valueType,valueSize); 
      switch (valueType) { 
       case REG_BINARY: 
        _tprintf(TEXT(" The value is binary (0x%X, 0x%X, 0x%X ...)\n"),valueBytes[0],valueBytes[1],valueBytes[2]); 
        break; 
       case REG_DWORD: 
       //case REG_DWORD_LITTLE_ENDIAN: 
        _tprintf(TEXT(" The value is a DWORD (%d)\n"),*(DWORD *)valueBytes); 
        break; 
       case REG_DWORD_BIG_ENDIAN: 
        _tprintf(TEXT(" The value is a DWORD (big endian) (%d)\n"),(valueBytes[0]<<24)|(valueBytes[1]<<16)|(valueBytes[2]<<8)|valueBytes[3]); 
        break; 
       case REG_EXPAND_SZ: 
       case REG_SZ: 
        _tprintf(TEXT(" The value is a string\n")); 
        break; 
       case REG_LINK: 
        _tprintf(TEXT(" The value is a link\n")); 
        break; 
       case REG_MULTI_SZ: 
        _tprintf(TEXT(" The value is a multi-string\n")); 
        break; 
       case REG_NONE: 
        _tprintf(TEXT(" There is no spoon... sorry, value\n")); 
        break; 
       case REG_RESOURCE_LIST: 
        _tprintf(TEXT(" The value is a resource list\n")); 
        break; 
       default: 
        _tprintf(TEXT(" Unknown value type\n")); 
        break; 
      } 
     } 
     else 
     { 
      _tprintf(TEXT("error reading value %d - %d\n"),i+1,retCode); 
     } 
+0

は本当にうまく働いている7おかげさまでたくさんあります –

+0

@thorよろしくお願いします。この回答が役立つ場合は、左側のチェックマークをクリックして回答を受け入れる必要があります。あなたが求めた他の質問と同じことをする必要があります。 – IronMensan

+0

はWindows XPでサポートされているRegEnumValueですか? –

2
+0

おそらく、実行可能ファイルが.NETフレームワークに依存したくないと思うかもしれません。 –

+0

@NorbertWillhelm彼はWindowsのレジストリに取り組んでいるので、そうしないと正当な理由があることはほとんどありません。 (不可能だとは思わない、ちょうどそうではない) –

0

私のキーの一部はRegEnumKeyEx(で「閲覧」されていません) 。 私は問題が32/64ビットの問題であることを理解するために半日のようなことを費やしました。

既定では、WOW64で実行されている32ビットアプリケーションは32ビットレジストリビューにアクセスし、64ビットアプリケーションは64ビットレジストリビューにアクセスします。

が正しくsamDesiredパラメータを設定する方法を見つけるためにMSDN : Alternate Registry Viewをお読みください。