使用RegQueryValueEx将reg_sz作为输入并将其用作char数组

using RegQueryValueEx to take reg_sz as input and use that as char array

本文关键字:char 数组 输入 reg sz 使用 RegQueryValueEx      更新时间:2023-10-16

我正在提取REG_SZ类型的注册表值,并将其用作字符数组。我曾尝试在byte*缓冲区中输入,但无法在char数组中获取。

BYTE* buffer = new BYTE[cbMaxValueData];
ZeroMemory(buffer, cbMaxValueData);
buffer[0] = '';
LONG dwRes = RegQueryValueEx(hKey, oem_name, 0, NULL, buffer, &lpData);
_tprintf(TEXT("(%d)  %s: %sn"), i+1, oem_name, buffer);

我想要的是提取缓冲区的每个字符,但我找不到任何方法:PS:我的注册表项中的值为REG_SZ类型

基本上,如果有人能帮助我将BYTE*缓冲区转换为char*var或字符串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 %un", result);

但是像这样具有固定大小缓冲区的代码通常是不够的。如果您正在读取未知数据,那么您应该在循环中调用RegQueryValueEx。首先使用NULL缓冲区来获取大小,然后分配并再次调用。您需要一个循环,因为其他人可能会在对RegQueryValueEx的两次调用之间增加数据的大小!

即使你做了所有这些,你仍然有问题需要处理,因为你读取的字符串可能没有\0终止。您必须手动终止或改用RegGetValue