在 C++ 中将字符串 (REG_SZ) 值写入注册表

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/505024/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-27 15:42:41  来源:igfitidea点击:

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

c++registry

提问by Brian Sweeney

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 is below:

我已经获得了将值写入 Windows 注册表的大部分代码,但是当我更改为测试而设置的虚拟键和值的路径时,它失败了。我的代码如下:

    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
LPCTSTR sk = TEXT("SOFTWARE\TestSoftware");
"; 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."); }

All three tests yield error statuses.

所有三个测试都会产生错误状态。

The part that confuses me is that I was able to run this code when pointing it at other portions of the registry. Any ideas?

令我困惑的部分是我能够在将它指向注册表的其他部分时运行此代码。有任何想法吗?

thanks, brian

谢谢,布赖恩

回答by Brian Sweeney

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

我觉得很傻。解决方案是需要正确转义字符串中的斜杠,如下所示:

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;
}

Hopefully someone finds this useful...

希望有人觉得这很有用......

回答by De Alfa

//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.");
}

I am using this code.

我正在使用此代码。

回答by Master James

For UNICODEenvironment:

对于UNICODE环境:

##代码##