Я работаю над тем, чтобы извлечь значение реестра типа REG_SZ и использовать его как массив символов. Я пытался получить входные данные в буфере байтов *, но в дальнейшем не смог получить его в массиве символов.
BYTE* buffer = new BYTE[cbMaxValueData];
ZeroMemory(buffer, cbMaxValueData);
buffer[0] = '\0';
LONG dwRes = RegQueryValueEx(hKey, oem_name, 0, NULL, buffer, &lpData);
_tprintf(TEXT("(%d) %s: %s\n"), i+1, oem_name, buffer);
что я хочу, чтобы извлечь каждый символ буфера, но я не нахожу никакого способа:
PS: значение в моем разделе реестра имеет тип REG_SZ
в принципе, если кто-то может помочь мне в преобразовании буфера BYTE * в char * var или string str, то это тоже решит мою проблему
Код, который вы разместили, является неполным и не компилируется, и вы не проверяете возвращаемое значение из RegQueryValueEx!
Разница между BYTE*
а также char*
это не проблема, и вы можете просто привести к char *, потому что они оба представляют собой массивы байтового размера, и вы не заботитесь о знаке.
Обычно вы не выделяете массив BYTE при чтении из реестра, вы выделяете тип, который читаете, и просто приводите при вызове функции:
TCHAR buffer[100];
DWORD size = sizeof(buffer);
LONG result = RegQueryValueEx(hKey, oem_name, 0, NULL, (BYTE*) buffer, &size);
if (ERROR_SUCCESS == result) _tprintf(....); else printf("Error %u\n", result);
но такого кода с буфером фиксированного размера часто недостаточно. Если вы читаете неизвестные данные, вы должны вызвать RegQueryValueEx в цикле. Сначала с пустым буфером, чтобы получить размер, затем выделить и снова вызвать. Вам нужен цикл, потому что кто-то другой может увеличить размер данных между двумя вызовами RegQueryValueEx!
Даже если вы делаете все это, у вас все еще есть проблемы, потому что прочитанная строка может не заканчиваться на \ 0. Вы должны вручную прекратить или использовать RegGetValue
вместо.
Других решений пока нет …