2014-04-20 5 views
0

다음 함수를 사용하여 벡터의 특정 키와 하위 키에 대한 모든 레지스트리 키를 열거하고이를 반환합니다.모든 레지스트리 키를 가장 효율적으로 열거하는 방법

그러나이 코드는 200000 이상의 키와 같이 큰 키 값에 대해서는 매우 느리게 실행되는 것으로 보입니다. 완료하는 데는 5 분 이상 걸립니다. 어떻게하면 더 효율적으로 만들 수 있는지 알고 싶습니다.

vector<string> CRegistryAPI::EnumKeys(HKEY RootKey, string SubKey) 
{ 
    DWORD keyLen = 255; 
    int index = 0; 
    int ret = 0; 
    PFILETIME lastWrite = 0; 
    HKEY hKey = 0; 
    char keyName[255]; 
    vector<string> keyList; 

    if (RegOpenKeyExA(RootKey, SubKey.c_str(), 0, KEY_ENUMERATE_SUB_KEYS,&hKey) != ERROR_SUCCESS) 
     return keyList; 
    do 
    { 
     ret = RegEnumKeyExA(hKey, index, keyName, &keyLen, 0, 0, 0, lastWrite); 
     if (ret == ERROR_SUCCESS) 
     { 
      keyList.push_back(keyName); 
     } 
     index ++; 
     keyLen = 255; 
    } 
    while (ret == ERROR_SUCCESS); 

    if (hKey != NULL) 
     RegCloseKey(hKey); 

    return keyList; 
} 

도움을 주시면 감사하겠습니다. 감사.

+0

그것은 많은 키 –

+0

왜 당신이 모든 키를 열거 할 않음을 열거하는 데 시간이 오래 걸립니다 : 당신은 대신에 반환 된 버퍼 길이를 사용해야합니까? – Deduplicator

+0

레지스트리 클리너 도구를 작성하십시오. 나는 동등한 C# 함수를 가지고있다. – foobar

답변

1

당신이 할 수있는 최적화 중 하나는 RegQueryInfoKey()을 사용하여 주어진 키에 대한 정보를 쿼리 한 다음 그 내용을 열거하는 것입니다. 그것은 열거하는 동안 여러 번 재 할당 할 필요가 없습니다 그래서 예를 들어, 당신은 당신의 벡터의 용량을 미리 할당 할 수 있습니다

RegQueryInfoKey(hKey, 0, 0, 0, 0, 0, 0, &dwNumValues, 0, 0, 0, 0); 
keyList.reserve(keyList.size()+dwNumValues); 

또한, 당신의 열거가 보장되지 않는 당신의 버퍼는 널 종료 벡터에 밀어 때입니다. 비록 그것이 있었다면, 당신의 푸시 방법은 매번 버퍼 길이를 계산하기 위해 std::string을 필요로합니다.

keyList.push_back(string(keyName, keyLen)); 
관련 문제