2013-10-28 124 views
2

我想要顯示HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run中的所有註冊表項,子項和值,以查看啓動時運行的程序。我正在使用此代碼從MS。枚舉註冊表項C++

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 == 0) 
{ 
    printf("No values found\n");       
} 


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); 
     } 
    } 
} 
} 








int RegKeyCount = 0; 

int main(int argc, char *argv[]) 
{ 


HKEY hTestKey; 

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

我在這混亂如果我在「SOFTWARE \微軟\的Windows \ CurrentVersion」,它會告訴我所有子項和值(我可以看到,運行是CURRENTVERSION的子項)的代碼,但是當我試圖讓它向我展示運行它的子項和值,即使有條目,也沒有發現任何東西。

我也應該說我不知道​​子鍵/值的值的名稱,它們可能是任何東西。

這確實是RegEnumValue應該做什麼或我需要使用另一個註冊表功能?

回答

1

我發現的唯一問題是您的參數中的空格爲RegOpenKeyEx(),如果您取出嵌入的空間以使其讀取TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"),則程序運行正常。

您的printf開始時有點混亂,也許您應該將"No values found\n"更改爲"No keys found\n"

if (cSubKeys == 0) 
    printf("No keys found\n");       

另外:如果你構建/運行該代碼作爲一個64位操作系統的32位程序,要知道,你會得到HKLM \ SOFTWARE內容\ Wow6432Node \微軟\的Windows \ CurrentVersion \運行,而不是HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run!