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

时间:2017-02-11 03:31:44

标签: c++ windows registry regedit

我正在努力提取REG_SZ类型的注册表值,并将其用作字符数组,我已尝试在byte * buffer中输入,但进一步无法在char数组中获取它。

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,那么它也会解决我的问题

1 个答案:

答案 0 :(得分:0)

您发布的代码不完整且无法编译,您没有检查RegQueryValueEx的返回值!

BYTE*char*之间的区别不是问题,您可以只转换为char *,因为它们都只是字节大小的数组,而您并不关心该符号。< / p>

在从注册表中读取时,通常不会分配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。首先使用NULL缓冲区来获取大小,然后再次分配和调用。你需要一个循环,因为其他人可能会在两次调用RegQueryValueEx之间增加数据的大小!

即使您执行了所有操作,仍然有问题需要处理,因为您读取的字符串可能不会被\ 0终止。您必须手动终止或使用RegGetValue