C ++ простое чтение из реестра проблемы - PullRequest
0 голосов
/ 19 декабря 2010

платформа - победа.

Хорошо, я пытаюсь получить значение ключа с именем 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 ]

2 голосов
/ 19 декабря 2010

Распечатайте фактическое значение ошибки. Вы можете найти системный код ошибки, который точно скажет вам, в чем проблема.

Обратите внимание, что RegGetValue будет возвращать строку широких символов, а не строку символов, что означает, что ваша переменная, использующая char s, даст вам мусор.

Пара проблем с самим кодом:

  1. dealWithRegistry ... правда? Как насчет ReadJavaUpdateSchedulerValue?
  2. sizeof(char) всегда 1 (по определению).
  3. В C ++ вы должны использовать static_cast здесь вместо приведения в стиле C.
  4. Вы не звоните RegCloseKey никуда!
1 голос
/ 19 декабря 2010
  1. ERROR_MORE_DATA указывает, что ваш буфер данных недостаточно велик для получения значения. См. Пример в статье MSDN на RegQueryValueEx , где приведен рецепт правильного размещения буфера.

  2. Использование вами литералов L"..." предполагает, что ваш проект скомпилирован как Unicode, что означает, что char data[] должно быть WCHAR data[] (или TCHAR data[]).

  3. Выражение sizeof (data) / sizeof (char) должно быть записано как sizeof (data) / sizeof (data[0]); таким образом, он останется корректным независимо от фактического типа, с которым объявлен data. Также в стандартной библиотеке MSVC есть (нестандартный) макрос _countof именно для этой цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...