2009-02-03 22 views
12

Sto provando a creare una nuova chiave di registro nel registro di Windows utilizzando C++. Ecco il codice che ho finora:Creare una nuova chiave di registro Windows utilizzando C++

HKEY hKey; 
    LPCTSTR sk = TEXT("SOFTWARE\\OtherTestSoftware"); 

    LONG openRes = RegCreateKeyEx(
      HKEY_LOCAL_MACHINE, 
      sk, 
      0, 
      NULL, 
      REG_OPTION_BACKUP_RESTORE, 
      KEY_ALL_ACCESS, 
      NULL, 
      &hKey, 
      NULL); 

    if (openRes==ERROR_SUCCESS) { 
     printf("Success creating key."); 
    } else { 
     printf("Error creating key."); 
    } 

    LPCTSTR value = TEXT("OtherTestSoftwareKey"); 
    LPCTSTR data = "OtherTestData\0"; 

    LONG setRes = RegSetValueEx (hKey, value, 0, REG_SZ, (LPBYTE)data, strlen(data)+1); 

    if (setRes == ERROR_SUCCESS) { 
     printf("Success writing to Registry."); 
    } else { 
     printf("Error writing to Registry."); 
    } 

    //RegDeleteKey(hKey, sk); 

    LONG closeOut = RegCloseKey(hKey); 

    if (closeOut == ERROR_SUCCESS) { 
     printf("Success closing key."); 
    } else { 
     printf("Error closing key."); 
    } 

sono in grado di aprire con successo una chiave esistente utilizzando un codice molto simile frammento (in pratica sostituire RegCreateKeyEx con RegOpenKeyEx). Immagino che uno o più degli argomenti che sto passando in RegCreateKeyEx stia causando il problema. Sinceramente non sono sicuro di dove le cose potrebbero essere ingannate dal momento che tutti i codici di errore che ho intrappolato mostrano il successo. Per riferimento, ecco la firma della funzione per RegCreateKeyEx:

/* 
* LONG WINAPI RegCreateKeyEx(
     __in  HKEY hKey, 
     __in  LPCTSTR lpSubKey, 
     __reserved DWORD Reserved, 
     __in_opt LPTSTR lpClass, 
     __in  DWORD dwOptions, 
     __in  REGSAM samDesired, 
     __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, 
     __out  PHKEY phkResult, 
     __out_opt LPDWORD lpdwDisposition 
    ); 
*/ 

Ogni pensiero sarebbe fantastico!

grazie, brian

+0

Dove si verifica esattamente il tuo errore (presumo alla chiamata RegCreateKeyEx(), ma non dovremmo indovinare), e cosa restituisce GetLastError()? –

+0

Hai intenzione di provare a eliminare la chiave appena creata? –

+1

Invece di REG_OPTION_BACKUP_RESTORE dovresti passare REG_OPTION_NON_VOLATILE (= 0). È possibile consultare il comportamento di tali opzioni da MSDN http://msdn.microsoft.com/en-us/library/ms724844(VS.85).aspx – Ismael

risposta

1

Il primo indizio è l'utilizzo del REG_OPTION_BACKUP_RESTORE. Probabilmente non vuoi usare quel flag, perché credo che sia necessario un privilegio speciale di "backup" che devi abilitare in anticipo. Le normali applicazioni non vorranno farlo.

+0

Sì; non solo hai bisogno del privilegio, ma devi abilitarlo esplicitamente tramite una chiamata API di sicurezza; a meno che tu non lo sappia già, probabilmente non vuoi usarlo. :) – Nick

+0

modificato in REG_OPTION_NON_VOLATILE, non sembra averlo corretto. –

2

Come già accennato, è stata specificata l'opzione REG_OPTION_BACKUP_RESTORE nella chiamata a RegCreateKeyEx, il che significa che si sta aprendo la chiave per eseguire un backup o un ripristino. Normalmente, si dovrebbe usare REG_OPTION_NON_VOLATILE invece.

Quale sistema operativo è in esecuzione? In Windows 2000/XP, l'hive del registro HKEY_LOCAL_MACHINE non è scrivibile da utenti non amministratori, pertanto RegCreateKeyEx non riuscirà con un errore di accesso negato (errore 5). Questo vale anche per Vista, se la tua applicazione ha una voce requestedExecutionLevel nel suo manifest. Se stai usando Vista, e la tua applicazione non specifica uno requestedExecutionLevel (o se non ha affatto un manifest), l'accesso a HKEY_LOCAL_MACHINE verrà virtualizzato, quindi RegCreateKeyEx dovrebbe riuscire. Vedere Registry Virtualization in Windows Vista in MSDN per ulteriori dettagli.

Ci sono altri problemi con il codice che hai postato, che diventerà evidente solo se si compila il progetto con UNICODE definito. Questa linea:

LPCTSTR data = "OtherTestData\0"; 

dovrebbe essere

LPCTSTR data = TEXT("OtherTestData\0"); 

e questa linea: dovrebbe essere

LONG setRes = RegSetValueEx(hKey, value, 0, REG_SZ, 
    (LPBYTE)data, _tcslen(data)+1); 

:

LONG setRes = RegSetValueEx(hKey, value, 0, REG_SZ, 
    (LPBYTE)data, (_tcslen(data)+1) * sizeof(TCHAR)); 

perché il parametro cbData nel RegSetValueEx è il leng th dei dati in byte, non caratteri.

Spero che questo aiuti!

+0

Ho apportato le modifiche con un'eccezione: (_tcslen (dati) +1) * sizeof (TCHAR) modificato in (strlen (dati) +1) * sizeof (TCHAR) in quanto non compila il primo modo. Di nuovo, nessun codice di errore restituito, semplicemente non fa quello che mi aspetto. Grazie per i suggerimenti però, sembra che mi stia avvicinando! –

+0

Aggiungi #include per utilizzare _tcslen(). – ChrisN

+0

Se Unicode fosse abilitato, non credo che 'LPCTSTR data =" "' verrebbe compilato. –

13

Sto compilando da anni la mia libreria di funzioni personale. Una parte di questo si occupa interamente dell'accesso al registro, vedere la funzione CreateRegistryKey nel file Registry.Cpp.

Se sei interessato, puoi prendere lo entire library here.

+1

In realtà mi prenderò una pugnalata con questo - sembra molto amichevole grazie! –

+1

Registry.cpp link non funzionante, provare invece: http://svn.networkdls.com/svn/OpenSource/@Libraries/NSWFL/NSWFL_Registry.Cpp –

+0

Non ha definito IsWinNT –

Problemi correlati