2014-10-21 3 views
0

HIVE 키의 하위 키를 찾으려고합니다. 아래 코드는 내 코드 모든 하위 키를 가져올 수 있습니다. 레지스트리에서 하위 키에 대한 하위 키를 가져올 수 없습니다. 재귀 코드를 작성했습니다. 그러나, 그것은 나에게 어떤 결과도주지 않는다! 어떤 도움을 주시면 감사하겠습니다!시스템 레지스트리의 재귀를 통해 하위 키의 하위 키를 인쇄 할 수 없습니다.

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

#define MAX_KEY_LENGTH 255 
#define MAX_VALUE_NAME 16383 

void QueryKey(HKEY hkey) 
{ 
    TCHAR achKey[MAX_KEY_LENGTH]; 
    DWORD cbName; 
    TCHAR achClass[MAX_PATH] = TEXT(""); 
    DWORD cchClassName = MAX_PATH; 
    LPBYTE data = (LPBYTE)malloc(512); 
    DWORD cSubKeys=0; 
    DWORD dataType,cbMaxSubKey,cchMaxClass,cValues,retcode2,valueType,dataSize; 
    long lResult; 
    DWORD cchMaxValue,cbMaxValueData; 
    int y; 
    DWORD cbSecurityDescriptor; 
    char buffer[255]= {0}; 
    DWORD dwbuffersize = sizeof(buffer); 
    FILETIME ftLastWriteTime; 
    DWORD i, retCode,retCode2; 
    TCHAR achValue[MAX_VALUE_NAME]; 
    DWORD cchValue = MAX_VALUE_NAME; 

    retCode = RegQueryInfoKey(hkey, 
     (LPWSTR)achClass, &cchClassName,NULL, &cSubKeys,&cbMaxSubKey, &cchMaxClass, 
     &cValues,&cchMaxValue, &cbMaxValueData, &cbSecurityDescriptor, 
     &ftLastWriteTime);   
    if(cSubKeys) 
    { 
     printf("\n Subkey Names:"); 
     for(i=0; i<cSubKeys; i++) 
     { 
      cbName = MAX_KEY_LENGTH; 
      retCode = RegEnumKeyEx(hkey, i,(LPWSTR)achKey,&cbName,   
            NULL,NULL,NULL,&ftLastWriteTime); 
      if(retCode == ERROR_SUCCESS) 
      { 
       printf("\n(%d) %S", i+1, achKey); 
       QueryKey((HKEY)subkey); 
      } 
     } 
     printf("\n Number of subkeys: %d\n\n", cSubKeys); 
    } 
    else 
     printf("\n there is no subkey"); 

    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'; 
      retCode2 = RegEnumValue(hkey, i, achValue, &cchValue, NULL, 
            &dataType, data, &dataSize); 
      if(retCode2==ERROR_SUCCESS) 
       printf("\n%u",&dataType); 
      else 
       printf("no"); 

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

int main(int argc , char *argv[]) 
{ 
    HKEY hTestKey; 
    TCHAR buffer[260]; 
    DWORD bufferSize = sizeof(buffer); 

    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, NULL, 0, KEY_READ, &hTestKey) == ERROR_SUCCESS) 
    { 
     printf("\n-------Registry Information----------"); 
     printf("\n HIVE_NAME : HKEY_LOCAL_MACHINE"); 
     QueryKey(hTestKey); 
    } 
    else 
     printf("bye"); 

    RegCloseKey(hTestKey); 

    return 0; 
} 

답변

0

당신은 단지 HKEYQueryKey에에 하위 키 캐스트의 캐릭터 이름을 전달할 수 없습니다. 당신은 키를 열어 당신이 얻을 수있는 실제 HKEY 전달해야합니다

  HKEY subkey; 
      LONG r = RegOpenKeyEx(hkey, achKey, 0, KEY_ALL_ACCESS, &subkey); 
      if (r == ERROR_SUCCESS) { 
       QueryKey(subkey); 
       RegCloseKey(subkey); 
      } 
+0

결과는 동일합니다! –

+0

HKEY 하위 키; LONG r = RegOpenKeyEx (hkey, achKey, 0, KEY_ALL_ACCESS, & subkey); (r = ERROR_SUCCESS) { QueryKey (하위 키); RegCloseKey (하위 키); }이 작업을 수행 할 때 하이브의 모든 하위 키 옆에 0이 표시됩니다! 그것에 관한 어떤 생각? –

+0

@ramuranga 지금은 테스트 할 수 없습니다. 위의 'if'대신'=='대신'='를 사용하여 오류를 수정했습니다. – ooga

0

이 비슷한 더 많은 것을보십시오 : 나는 ..하지만 퍼팅 시도

#ifdef UNICODE 
#define TCHAR_FMT "%S" 
#else 
#define TCHAR_FMT "%s" 
#endif 

typedef std::basic_string<TCHAR> tstring; 

void QueryKey(HKEY hkey, const tstring &keyPath) 
{ 
    TCHAR achKey[MAX_KEY_LENGTH]; 
    DWORD cbName; 
    TCHAR achClass[MAX_PATH] = {0}; 
    DWORD cchClassName = MAX_PATH; 
    DWORD cSubKeys = 0; 
    DWORD dataType, cbMaxSubKey, cchMaxClass, cValues, valueType, dataSize; 
    long lResult; 
    DWORD cchMaxValue, cbMaxValueData; 
    DWORD cbSecurityDescriptor; 
    FILETIME ftLastWriteTime; 
    DWORD i; 
    TCHAR achValue[MAX_VALUE_NAME]; 
    DWORD cchValue = MAX_VALUE_NAME; 
    HKEY hTmpKey; 

    lResult = RegQueryInfoKey(hkey, 
     achClass, &cchClassName, NULL, &cSubKeys, &cbMaxSubKey, &cchMaxClass, 
     &cValues, &cchMaxValue, &cbMaxValueData, &cbSecurityDescriptor, 
     &ftLastWriteTime);   

    if (lResult != ERROR_SUCCESS) 
    { 
     printf("\n cannot query key: " TCHAR_FMT ", error %d", keyPath.c_str(), lResult); 
     return; 
    } 

    if (cSubKeys) 
    { 
     printf("\n Number of subkeys: %u", cSubKeys); 
     printf("\n Subkey Names:"); 
     for(i = 0; i < cSubKeys; ++i) 
     { 
      cbName = MAX_KEY_LENGTH; 
      lResult = RegEnumKeyEx(hkey, i, achKey, &cbName,   
            NULL, NULL, NULL, &ftLastWriteTime); 
      if (lResult == ERROR_SUCCESS) 
      { 
       achKey[cbName] = 0; 
       printf("\n(%u) " TCHAR_FMT, i+1, achKey); 

       tstring subkeyPath = keyPath + TEXT("\\") + achKey; 

       lResult = RegOpenKeyEx(hKey, achKey, 0, KEY_READ, &hTmpKey); 
       if (lResult == ERROR_SUCCESS) 
       { 
        QueryKey(hTmpKey, subkeyPath); 
        RegCloseKey(hTmpKey); 
       } 
       else 
        printf("\n cannot open subkey: " TCHAR_FMT ", error %d", subkeyPath.c_str(), lResult); 
      } 
      else 
       printf("\n cannot query subkey name, error %d", lResult); 
     } 
    } 
    else 
     printf("\n there is no subkey"); 

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

     for (i = 0, i < cValues; ++i) 
     { 
      cchValue = MAX_VALUE_NAME; 
      lResult = RegEnumValue(hkey, i, achValue, &cchValue, NULL, 
            &dataType, data, &dataSize); 
      if (lResult == ERROR_SUCCESS) 
      { 
       achValue[cchValue] = 0; 
       printf("\n (%d) %u: " TCHAR_FMT, i+1, dataType, achValue); 
      } 
      else 
       printf("\n cannot query value name, error %d", lResult); 
     } 
    } 
    else 
     printf("\n there is no value"); 
} 

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

    printf("\n-------Registry Information----------"); 
    printf("\n HIVE_NAME : HKEY_LOCAL_MACHINE"); 

    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, NULL, 0, KEY_READ, &hTestKey) == ERROR_SUCCESS) 
    { 
     QueryKey(hTestKey, TEXT("\\")); 
     RegCloseKey(hTestKey); 
    } 
    else 
     printf("\n cannot open hive, error %d", lResult); 

    return 0; 
} 
관련 문제