2013-02-26 15 views
5

Próbuję odczytać rejestru „(Domyślna)” Wartości w Windows 7 w C++ i Poniżej znajduje się kod używam:Odczyt rejestru w Windows 7 zachowuje się dziwnie

string GetSZValueUnique(HKEY openKey, const char* regkey, const char* keyName) 
{ 
    HKEY hKey = 0; 
    BYTE data[512] ; 
    DWORD szsize = 512 ; 
    string value ; 

    LONG retValue = RegOpenKeyEx(openKey, regkey, 0, KEY_READ, &hKey) ; 

    if (retValue == ERROR_SUCCESS) 
    { 
     LONG retV = RegQueryValueEx(hKey, keyName, 0, 0, data, &szsize) ; 
     if (retV == ERROR_SUCCESS) 
     { 
      char* _value = reinterpret_cast<char*>(data) ; 
      value = _value ; 

      RegCloseKey (hKey) ; 
      return value ; 
     } 
     else 
     { 
      char msg[512] ; 
      FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,(DWORD)retV,0,&msg[0],512,0) ; 
      error_string = &msg[0]; 
      MessageBox(0, error_string.c_str(), "Query : GetSZValueUnique", 0); 
     } 
    } 
    else 
    { 
     char msg[512] ; 
     FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,0,(DWORD)retV,0,&msg[0],512,0) ; 
     error_string = &msg[0]; 
     MessageBox(0, error_string.c_str(), "Open : GetSZValueUnique", 0); 
    } 

    RegCloseKey (hKey) ; 
    return "" ; 
} 

I to jest jak ja wzywam powyższą funkcję:

string ts3 = GetSZValueUnique(HKEY_LOCAL_MACHINE, "SOFTWARE\\TeamSpeak 3 Client\\", ""); 
if (!ts3.empty()) 
    MessageBox(0, ts3.c_str(), "GetSZValueUnique", 0); 

dla niektórych klawiszy działa dla niektórych to nie: na przykład, że pracuje dla „Adobe”, „TrendMicro”, „Checkpoint”, „RegisteredApplications”, ale nie dla "7-Zip", "RTLSetup", "Sonic", "TeamSpeak 3 Client"

Jestem teraz bez pomysłów, czy ktoś może wskazać, co jest nie tak?

EDIT: Sprawdziłem kod „(domyślne)” wartości i inne wartości, jak również, na klucze jej nie pracuje to nie mija * „if (retValue == ERROR_SUCCESS)” * sprawdzić i I zawsze otrzymuję "Określony plik nie znaleziono" błąd. Dla kluczy działa, przechodzi przez kontrolę "* if (retValue == ERROR_SUCCESS) *" i zwraca wartość, jeśli jej obecny, jeśli jej nie ma, po prostu wyświetla komunikat o błędzie "Podany plik nie został znaleziony".

EDIT 2: Sprawdziłem jeszcze raz, i wydaje się, że to działa na klucze mają odpowiednią klon w „Wow6432Node” podklucz SOFTWARE ... hmmm ... więc jak mogę to działa?

+0

Jakie zachowanie występuje? Czy ręcznie sprawdziłeś, czy są jakieś dane dotyczące tych ostatnich wpisów? –

+3

Po pierwsze, czy Twoja aplikacja ma 64-bitową lub 32-bitową, czy drugą, czy zauważyłeś różnicę w algorytmie "działającym", gdy 32-bitowa aplikacja wyszukuje 32-bitowe powiązane aplikacje lub 64-bitowa aplikacja wyszukuje 64-bitowe aplikacje, ale gdy miksujesz te dwie rzeczy wydaje się nie działać? Jeśli tak, to google [Wow6432Node] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724072 (v = vs.85) .aspx). – WhozCraig

+0

@ bash.d Zaktualizowano oryginalne pytanie. – StudentX

Odpowiedz

6

Można określić flagi ::

  1. "KEY_WOW64_32KEY" w "samDesired" parametr RegOpenKeyEx jeśli chcesz uzyskać dostęp Wow6432Node Keys tj 32-bitowe klucze z Twoja aplikacja.
  2. KEY_WOW64_64KEY” w „samDesired” parametr RegOpenKeyEx jeśli chcesz uzyskać dostęp do zwykłych klawiszy tj 64-bitowe klucze z aplikacji.

Uwaga: Wątpliwości zostały już usunięte przez @WhozCraig w komentarzach z odpowiednimi linkami. Jeśli on odpowie, przyjmij jego odpowiedź nad moją.

Powiązane problemy