2016-04-22 48 views
0

我仍然是C的初学者,我发现一个有用的代码在C whcih帮助我得到一个关键值,但我试图打印(“SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion” )与所有它的值和数据,但我只能得到没有数据的值,我想获得这两个值,它的数据就像(ProductName:Windows 7,SystemRoot:C:\ Windows等...),如果有人可以用这段代码帮助我,我会很感激,我使用了“RegQueryValueEx”,但它只给了我一个单一值的特定数据。枚举注册表项与它的数据在C

感谢

#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,achClass,&cchClassName,NULL,&cSubKeys,&cbMaxSubKey,&cchMaxClass,&cValues,&cchMaxValue,&cbMaxValueData,&cbSecurityDescriptor,&ftLastWriteTime); 
    // 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 _tmain(void) 
{ 
    HKEY hTestKey; 
    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
     TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"),0, KEY_READ, &hTestKey) == ERROR_SUCCESS 
    ) 

    { 
     QueryKey(hTestKey); 

    } 
    RegCloseKey(hTestKey); 
} 
+0

花一些时间来学习什么都那些看起来像是空的奇序列的功能,特别是参数,其实* *做。它可能证明是有用的。 – WhozCraig

+0

其实我知道大部分的功能,我知道如何从RegQueryValueEX函数获取单个数据的值,但我只是不知道如何获取所有数据而不是单一的RegQueryValueEX – Student

回答

0

为什么不喜欢REGEDIT -E thorugh C程序运行命令,通过这个就可以轻松导出全部价值,然后使用文件处理mechnism在C. 请按照链接解读为正常的文件。
http://www.computerhope.com/issues/ch000848.htm

+0

嗯,我想知道如何使用RegQueryValueEX。 – Student