c ++从注册表问题中简单阅读

时间:2010-12-19 12:15:56

标签: c++ windows registry

平台胜利。

我正在尝试获取一个名为SunJavaUpdateSched的键的值,但我得到了 一个错误。我得到了第二个错误,不知怎的,我可以打开钥匙,但无法获得价值。所以这是到目前为止的代码:

void dealWithRegistry()
{
 HKEY regkey1;
 char data[100];
 DWORD datasize = sizeof (data) / sizeof (char);
 LONG rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_READ, &regkey1);
 if (rc != ERROR_SUCCESS)
 {
  cout << "there was a problem openning" << endl;
 }
 else
 {
  rc = RegGetValue (regkey1, NULL, L"SunJavaUpdateSched", RRF_RT_REG_SZ, NULL, (void*) data, &datasize);
  if (rc != ERROR_SUCCESS)
  {
  cout << "there was a problem getting the value" << endl;
  }
 }

 printf("%s\n", data);

}

2 个答案:

答案 0 :(得分:2)

打印出实际的错误值。您可以查找系统错误代码,它将准确地告诉您问题所在。

请注意RegGetValue将返回一个宽字符串,而不是字符串,这意味着使用char的变量会给你带来垃圾。

与代码本身存在问题:

  1. dealWithRegistry ......真的吗? ReadJavaUpdateSchedulerValue怎么样?
  2. sizeof(char)始终为1(根据定义)。
  3. 在C ++中,您应该使用static_cast而不是C样式转换。
  4. 您没有在任何地方致电RegCloseKey

答案 1 :(得分:1)

  1. ERROR_MORE_DATA表示您的数据缓冲区不大,无法接收该值。有关如何正确分配缓冲区的配方,请参阅example in the MSDN article on RegQueryValueEx

  2. 您对L"..."文字的使用表明您的项目已编译为Unicode,这意味着char data[]必须为WCHAR data[](或TCHAR data[])。< / p>

  3. 表达式sizeof (data) / sizeof (char)应写为sizeof (data) / sizeof (data[0]);这样,无论声明data的实际类型如何,它都将保持正确。此外,MSVC标准库完全具有(非标准)宏_countof