2009-08-27 17 views
7

Sto cercando un modo pulito per verificare se esiste una chiave del Registro di sistema. Avevo pensato che RegOpenKey avrebbe fallito se avessi provato ad aprire una chiave che non esisteva, ma non è così.Verifica se esiste una chiave del Registro di sistema

Potrei usare l'elaborazione delle stringhe per trovare e aprire la chiave genitore di quella che sto cercando, e quindi enumerare le sottochiavi di quella chiave per scoprire se quello che mi interessa esiste, ma che sente entrambi come un maiale performante e come un modo strano per implementare una funzione così semplice.

Direi che potresti usare RegQueryInfoKey per questo in qualche modo, ma MSDN non fornisce troppi dettagli su come, nel caso sia possibile.

Aggiornamento: Ho bisogno della soluzione in diritta win32 api, non in codice gestito, .NET o qualsiasi altra libreria.

La documentazione di MSDN sembrano indicare che si dovrebbe essere in grado di aprire una chiave per il permesso di lettura e ottenere un errore se non esiste, in questo modo:

lResult = RegOpenKeyEx (hKeyRoot, lpSubKey, 0, KEY_READ, &hKey); 

if (lResult != ERROR_SUCCESS) 
{ 
    if (lResult == ERROR_FILE_NOT_FOUND) { 

Tuttavia, ho ERROR_SUCCESS quando Ci provo.

Update 2: Il mio codice esatto è questo:

HKEY subKey = nullptr; 
LONG result = RegOpenKeyEx(key, subPath.c_str(), 0, KEY_READ, &subKey); 
if (result != ERROR_SUCCESS) { 

... ma risultato esce come ERROR_SUCCESS, anche se ho messo in una chiave che non esiste.

Aggiornamento 3: Sembra che voi ragazzi abbiate ragione. Questo fallisce su uno specifico esempio di test (misteriosamente). Se provo su qualsiasi altra chiave, restituisce il risultato corretto. Doublechecking con l'editor del Registro di sistema ancora non mostra la chiave. Non so cosa farmene.

+4

Qual è il percorso della chiave che stai controllando? È possibile che tu stia correndo in uno dei percorsi magici che vengono reindirizzati (come Wow6432Node)? Ho un vago ricordo di vedere questo problema prima. Penso che tu possa aprire una chiave inesistente. Si verificherà un errore quando si tenta effettivamente di impostare o interrogare un valore in quella chiave. –

+1

Potrebbe anche essere in [registro VirtualStore] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa965884%28v=vs.85%29.aspx). – ghord

risposta

7

Prima di tutto non preoccuparti delle prestazioni per cose come questa. A meno che non lo stiate interrogando 100 volte al secondo, sarà più che abbastanza veloce. L'ottimizzazione prematura causerà tutti i tipi di mal di testa.

RegOpenKeyEx restituirà ERROR_SUCCESS se trova la chiave. Basta controllare questa costante e sei a posto.

+1

Bene, questo non è tanto un caso di ottimizzazione prematura quanto di non voler aggiungere quel tipo di complessità al codice. – slicedlime

4

RegOpenKey restituisce un errore se la chiave non esiste. Come stai usando? Il valore di ritorno previsto è ERROR_FILE_NOT_FOUND.

dal codice:

HKEY subKey = nullptr; 
LONG result = RegOpenKeyEx(key, subPath.c_str(), 0, KEY_READ, &subKey); 
if (result != ERROR_SUCCESS) { 

vorrei guardare il valore della key e subPath e assicurarsi che essi sono ciò che ci si aspetta, e non che la chiave esiste effettivamente. Qual è il valore di subKey in seguito? Ovviamente sta aprendo qualcosa - prova ad enumerarlo per vedere quali sono le chiavi e i valori sottostanti.

Non vi è alcun problema con RegOpenKey che non restituisce un errore se la chiave non esiste. Non proverei a supporre che ci sia qualche tipo di bug del sistema operativo in qualcosa di comunemente usato come registro.

Forse si dispone di una chiave del Registro di sistema che non è visibile all'utente, l'utente che esegue l'editor del Registro di sistema, ma non al codice? Un problema di autorizzazioni forse? Il tuo codice è in esecuzione come utente con privilegi elevati in Windows Vista o Server 2008? Hai provato a eseguire l'editor del registro come amministratore?

+0

Puoi anche ottenere ERROR_PATH_NOT_FOUND –

0

Nota che accanto alle funzioni di registro "core" che iniziano con "Reg" ci sono anche le funzioni di supporto che iniziano con "SHReg". Questi sono destinati a use by the Shell, ad esempio Explorer, ma sono documentati e possono essere utilizzati anche nelle normali applicazioni. Sono in genere involucri sottili che semplificano alcune attività comuni. Fanno parte della "Shell LightWeight API" (shlwapi.dll)

Problemi correlati