используя RegQueryValueEx, чтобы взять reg_sz в качестве входных данных и использовать его как массив символов

Я работаю над тем, чтобы извлечь значение реестра типа 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, то это тоже решит мою проблему

-2

Решение

Код, который вы разместили, является неполным и не компилируется, и вы не проверяете возвращаемое значение из 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 вместо.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]