Прочитать раздел реестра, так как строка возвращает числовые значения - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь прочитать значение Windows «ProductName» из реестра, для получения значения я использую следующий код:

HKEY hKey;
DWORD buffer;
LONG result;
unsigned long type = REG_DWORD, size = 1024;

result = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_READ, &hKey);
if (result == ERROR_SUCCESS)
{
    RegQueryValueEx(hKey, "ProductName", NULL, &type, (LPBYTE)&buffer, &size);
    RegCloseKey(hKey);
}

std::stringstream ss;
ss << "version: " << buffer;
std::string s = ss.str();

MessageBox(NULL, s.c_str(), s.c_str(), MB_OK);

Вывод, который я получаю:

Version: 3435973836

но "regedit" возвращает "Windows 10 Enterprise". Любые намеки на то, почему я получаю это странное значение?

Ответы [ 3 ]

2 голосов
/ 03 апреля 2019

Вы не сохраняете результат в строке.

DWORD buffer;
...
RegQueryValueEx(hKey, "ProductName", NULL, &type, (LPBYTE)&buffer, &size);

Вместо этого вы должны явно использовать строку:

size_t size = 1024;
char buffer[size];
...

result = RegQueryValueEx(hKey, "ProductName", NULL, &type, buffer, &size);
if(result == ERROR_SUCCESS && type == REG_SZ)
{
  /* do stuff with buffer */
}
0 голосов
/ 04 апреля 2019

Как говорит @Lundin, вам нужно отправить строку, но не указатель DWORD. Я хочу добавить, что вы получили значение 3435973836 (0xcccccccc в шестнадцатеричном формате). Это означает, что вызов RegQueryValueEx не выполнен или даже не выполнил условие. Если это удастся, то значение buffer в не-Юникоде будет похоже на 1684957527 (0x646E6957). Зависит от первых 4 символов « Ветер задолженность 10 Предприятие», ' W ' = 0x57; ' i ' = 0x69; ' n '= 0x6e;' д '= 0x64;

ProductName «Windows 10 Enterprise» относится к локальному компьютеру, а не только к текущему пользователю, поэтому вам необходимо получить его из HKEY_LOCAL_MACHINE.

0 голосов
/ 03 апреля 2019

В вашем буфере ничего нет:

0xCCCCCCCC : Used by Microsoft's C++ debugging runtime 
             library to mark uninitialised stack memory

Каковы представления распределения памяти в Visual Studio C ++?

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