Writing string (REG_SZ) values to the registry in C++

后端 未结 3 645
天涯浪人
天涯浪人 2021-02-01 18:57

I\'ve got most of the code for writing a value to the windows registry, however when I change the path to a dummy key and value that I\'ve set up for testing it fails. My code

相关标签:
3条回答
  • 2021-02-01 19:26

    For UNICODE environment:

    //Writing to registry
    HKEY hKey;
    LPCTSTR sk = TEXT("SOFTWARE\\Microsoft\\Windows");
    
    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("Sample");
    WCHAR path[80] = TEXT("C:\\samples\\app.exe");
    
    LONG setRes = RegSetValueEx(hKey, value, 0, REG_SZ, (LPBYTE)path, sizeof(path));
    
    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.");
    }
    
    0 讨论(0)
  • 2021-02-01 19:36
    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;
    }
    

    I am using this code.

    0 讨论(0)
  • 2021-02-01 19:43

    I feel silly. The solution is that need to properly escape the slash in the string as follows:

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

    Hopefully someone finds this useful...

    0 讨论(0)
提交回复
热议问题