CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 4 of 4
  1. #1
    Join Date
    Apr 2012
    Posts
    1

    win registry function help

    i have this code to list registry key values and subkeys
    Code:
    #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++) 
            { 
           
    	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);
            }
    
            }
        }
    }
    
    void __cdecl _tmain(void)
    {
       HKEY hTestKey;
    
     //  if( RegOpenKeyEx( HKEY_CURRENT_USER,
      //      TEXT("SOFTWARE\\Microsoft"),
         if( RegOpenKeyEx( HKEY_LOCAL_MACHINE,
            TEXT("SYSTEM\\Setup"),
            0,
            KEY_READ,
            &hTestKey) == ERROR_SUCCESS
          )
       {
          QueryKey(hTestKey);
       }
       
       RegCloseKey(hTestKey);
       system("pause");
    }
    how can i modify the function void QueryKey(HKEY hKey) to return registry key values and subvalues and list/print them in void __cdecl _tmain(void) function
    thanks a lot

  2. #2
    Arjay's Avatar
    Arjay is offline Moderator / EX MS MVP Power Poster
    Join Date
    Aug 2004
    Posts
    13,490

    Re: win registry function help

    Check out RegEnumKey[Ex].

  3. #3
    Join Date
    May 1999
    Location
    ALABAMA, USA
    Posts
    9,917

    Re: win registry function help

    You can use std vector or map whatever suits you better.
    If you have MFC support, you can use MFC native equivalents: CStringList or CMap
    There are only 10 types of people in the world:
    Those who understand binary and those who do not.

  4. #4
    Join Date
    Jul 2005
    Posts
    19

    Re: win registry function help


Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured