2009-02-02 38 views
16

Tengo la mayor parte del código para escribir un valor en el registro de Windows, sin embargo, cuando cambio la ruta a una clave ficticia y el valor que configuré para probando falla. Mi código está a continuación:Escribir valores de cadena (REG_SZ) en el registro en 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."); 
    } 

Las tres pruebas arrojan estados de error.

La parte que me confunde es que pude ejecutar este código cuando lo señalé en otras partes del registro. ¿Algunas ideas?

gracias, Brian

+1

Tenga en cuenta que la función 'RegSetValueEx' toma la longitud de cadena en bytes (no caracteres) como su último argumento. Por lo tanto, es mejor utilizar 'StringCbLength' en lugar de' strlen'. –

Respuesta

29

me siento tonta. La solución es que la necesidad de escapar correctamente la barra en la cadena de la siguiente manera:

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

Esperemos que alguien encuentra este útil ...

+2

O, comenzando con VC++ 2013: 'LR" ("SOFTWARE \ TestSoftware") "' Estos se llaman _raw string literals_. – 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; 
} 

estoy utilizando este código.

+1

Edite su código anterior directamente en lugar de publicar una segunda respuesta a la pregunta. –

+0

Considere editar su respuesta para incluir una explicación de cómo su código resuelve el problema en cuestión. – Matt

+0

¿Qué pasa con las cadenas de código unidad? –

Cuestiones relacionadas