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