2009-02-02 18 views
16

Ho la maggior parte del codice per scrivere un valore nel registro di Windows, tuttavia quando cambio il percorso di una chiave fittizia e il valore che ho impostato per test fallisce. Il mio codice è qui sotto:Scrivere valori stringa (REG_SZ) nel registro in C++

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

    LONG openRes = RegOpenKeyEx(HKEY_LOCAL_MACHINE, sk, 0, KEY_ALL_ACCESS , &hKey); 

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

    LPCTSTR value = TEXT("TestSoftwareKey"); 
    LPCTSTR data = "TestData\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."); 
    } 

    LONG closeOut = RegCloseKey(hKey); 

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

Tutti e tre i test restituiscono stati di errore.

La parte che mi confonde è che ero in grado di eseguire questo codice quando lo si punta su altre porzioni del registro. Qualche idea?

grazie, brian

+1

Si noti che la funzione 'RegSetValueEx' prende la lunghezza della stringa in byte (non caratteri) come ultimo argomento. Pertanto, è meglio usare 'StringCbLength' invece di' strlen'. –

risposta

29

mi sento stupido. La soluzione è che hanno bisogno di fuggire correttamente la barra nella stringa come segue:

LPCTSTR sk = TEXT("SOFTWARE\\TestSoftware"); 

Speriamo che qualcuno trova questo utile ...

+2

Oppure, a partire da VC++ 2013: 'LR" ("SOFTWARE \ TestSoftware") "' Questi sono chiamati _raw string letterals_. – MSalters

2
HKEY OpenKey(HKEY hRootKey, char* strKey) 
{ 
    HKEY hKey; 
    LONG nError = RegOpenKeyEx(hRootKey, strKey, NULL, KEY_ALL_ACCESS, &hKey); 

    if (nError==ERROR_FILE_NOT_FOUND) 
    { 
    cout << "Creating registry key: " << strKey << endl; 
    nError = RegCreateKeyEx(hRootKey, strKey, NULL, NULL,  REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL, &hKey, NULL); 
    } 

    if (nError) 
    cout << "Error: " << nError << " Could not find or create " <<  strKey << endl; 

    return hKey; 
} 

void SetintVal(HKEY hKey, LPCTSTR lpValue, DWORD data) 
{ 
    LONG nError = RegSetValueEx(hKey, lpValue, NULL, REG_DWORD, (LPBYTE)&data, sizeof(DWORD)); 

    if (nError) 
     cout << "Error: " << nError << " Could not set registry value: " << (char*)lpValue << endl; 
} 

DWORD GetintVal(HKEY hKey, LPCTSTR lpValue) 
{ 
    DWORD data; 
    DWORD size = sizeof(data); 
    DWORD type = REG_DWORD; 
    LONG nError = RegQueryValueEx(hKey, lpValue, NULL, &type, (LPBYTE)&data, &size); 

    if (nError==ERROR_FILE_NOT_FOUND) 
    data = 0; 
    SetVal() is called. 
    else if (nError) 
    cout << "Error: " << nError << " Could not get registry value " << (char*)lpValue << endl; 

    return data; 
} 

BOOL SetcharVal(HKEY Key,char* subkey,char* StringName,char* Stringdata) 
{ 
    HKEY hKey = OpenKey(Key,subkey); 

    LONG openRes = RegOpenKeyEx(Key, subkey, 0, KEY_ALL_ACCESS , &hKey); 

    if (openRes==ERROR_SUCCESS) { 

    } else { 
    printf("Error opening key."); 
    } 

    LONG setRes = RegSetValueEx (hKey, StringName, 0, REG_SZ, (LPBYTE)Stringdata, strlen(Stringdata)+1); 

    if (setRes == ERROR_SUCCESS) { 

    } else { 
    printf("Error writing to Registry."); 
    } 

    LONG closeOut = RegCloseKey(hKey); 

    if (closeOut == ERROR_SUCCESS) { 

    } else { 
    printf("Error closing key."); 
    } 

} 

char* GetCharVal(HKEY Key,char* subkey,char* StringName) 
{ 
    DWORD dwType = REG_SZ; 
    HKEY hKey = 0; 
    char value[1024]; 
    DWORD value_length = 1024; 
    RegOpenKey(HKEY_LOCAL_MACHINE,subkey,&hKey); 
    RegQueryValueEx(hKey, StringName, NULL, &dwType, (LPBYTE)&value,  &value_length); 
    RegCloseKey(hKey); 
    return value; 
} 

Sto usando questo codice.

+1

Modifica il tuo codice precedente direttamente anziché pubblicare una seconda risposta alla domanda. –

+0

Ti preghiamo di modificare la tua risposta per includere una spiegazione di come il tuo codice risolve il problema. – Matt

+0

E riguardo le stringhe del codice unità? –

Problemi correlati