Как прочитать QWORD (64-разрядный) из реестра на C ?

#c #dword

Вопрос:

Как мне прочитать REG_QWORD из реестра? В частности, информация об аппаратном обеспечении.QWM запоминает . Я обнаружил, что с его разделением на 1024, а затем еще раз разделенным на 1024, вы можете получить видеопамять в мегабайтах. Как я могу сначала прочитать QWORD? Я могу найти только то, как читать D-слова.

Комментарии:

1. Пропуск REG_QWORD для считываемого типа — смотрите здесь docs.microsoft.com/en-us/windows/win32/api/winreg/… и здесь docs.microsoft.com/en-us/windows/win32/sysinfo/…

Ответ №1:

Вы читаете a QWORD точно так же , как вы читаете a DWORD , используя RegQueryValueEx() только 64-разрядную целочисленную переменную вместо 32-разрядной целочисленной переменной, например:

 HKEY hKey;
if (RegOpenKeyEx(..., KEY_QUERY_VALUE, amp;hKey) == ERROR_SUCCESS) {
    QWORD value = 0; // or UINT64, ULONGLONG, ULONG64, ULARGE_INTEGER, etc...
    DWORD dwType, dwSize = sizeof(value);

    if (RegQueryValueEx(hKey, _T("HardwareInformation.qwMemorySize"), NULL, amp;dwType, reinterpret_cast<LPBYTE>(amp;value), amp;dwSize) == ERROR_SUCCESS) {
        if (dwType == REG_QWORD || dwType == REG_BINARY) {
            // use value as needed...
        }
    }

    RegCloseKey(hKey);
}
 

Или, используя RegGetValue() вместо этого:

 QWORD value = 0; // see above...
DWORD dwSize = sizeof(value);

if (RegGetValue(hkey, NULL, _T("HardwareInformation.qwMemorySize"), RRF_RT_QWORD, NULL, amp;value, amp;dwSize) == ERROR_SUCCESS) {
    // use value as needed...
}
 

Комментарии:

1. Для меня QWORD не определен, я не знаю почему…

2. Я думаю, что я определил его следующим образом:

3. typedef unsigned __int64 QWORD;

4. @JackRivera » QWORD не определен » — это зависит от версии установленного вами пакета SDK для Windows. Может быть, у вас есть более старая версия? Для типов данных Windows : typedef unsigned __int64 QWORD; Существует множество различных псевдонимов (unsigned) __int64 , определяемых Win32 API, DWORDLONG т. Е., DWORD64 , (U)INT64 , (U)LONGLONG , (U)LONG64 , и т.д. (U)LARGE_INTEGER Используйте то, что вам подходит, или просто используйте (unsigned) __int64 напрямую.

5. Я прошелся вверх и вниз по вашему ответу, и Верхнее решение сделало это за меня. Большое вам спасибо, поставьте галочку в моем правильном ответе за признательность.