2009-02-02 2 views
16

У меня есть большая часть кода для записи значения в реестр Windows, однако, когда я изменяю путь к фиктивному ключу и значение, которое я настроил для тестирование не выполняется. Мой код ниже:Значения записи строки (REG_SZ) в реестр в 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."); 
    } 

Все три теста дают статус ошибки.

Часть, которая меня смущает, заключается в том, что я смог запустить этот код, указав его на другие части реестра. Есть идеи?

спасибо, Брайен

+1

Обратите внимание, что функция RegSetValueEx принимает длину строки в байтах (а не в символах) в качестве последнего аргумента. Поэтому вам лучше использовать 'StringCbLength' вместо' strlen'. –

ответ

29

Я чувствую себя глупо. Решение состоит в том, что нужно правильно слеш в строке следующим образом:

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

Надеюсь, кто-то считает, что это полезно ...

+2

Или, начиная с VC++ 2013: 'LR '(« ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \ TestSoftware »)» 'Они называются _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; 
} 

Я использую этот код.

+1

Пожалуйста, отредактируйте свой предыдущий код напрямую, а не разместите второй ответ на вопрос. –

+0

Пожалуйста, подумайте над редактированием вашего ответа, чтобы включить объяснение того, как ваш код решает проблему. – Matt

+0

Как насчет строк unitcode? –

Смежные вопросы