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

Posted

技术标签:

【中文标题】使用 RegQueryValueEx 将 reg_sz 作为输入并将其用作 char 数组【英文标题】:using RegQueryValueEx to take reg_sz as input and use that as char array 【发布时间】:2017-02-11 03:31:44 【问题描述】:

我正在努力提取 REG_SZ 类型的注册表值并将其用作字符数组我已尝试在 byte* 缓冲区中获取输入,但进一步无法在 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 或字符串 str,那么它也将解决我的问题

【问题讨论】:

欢迎来到 Stack Overflow。请花时间阅读The Tour 并参考Help Center 中的材料,您可以在这里问什么以及如何问。 向我们展示您尝试使用的特定注册表值的所有详细信息,以及迄今为止您尝试访问它的代码。然后有人可能会在您需要做的事情上为您提供更好的帮助。 【参考方案1】:

您发布的代码不完整,无法编译,您没有检查 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。首先使用 NULL 缓冲区来获取大小,然后再次分配并调用。您需要一个循环,因为其他人可能会在两次调用 RegQueryValueEx 之间增加数据的大小!

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

【讨论】:

以上是关于使用 RegQueryValueEx 将 reg_sz 作为输入并将其用作 char 数组的主要内容,如果未能解决你的问题,请参考以下文章

使用RegQueryValueEx作为可能为REG_DWORD或REG_SZ的注册表值

如何在 C++ 中使用 RegQueryValueEx(..) 从注册表中读取 REG_MULTI_SZ 类型值

从 RegQueryValueEx 获取正确的值

获取windows操作系统版本

RegQueryValueEx正确使用方法

使用 RegQueryValueEx 和 HKEY_PERFORMANCE_COUNTER 获取“Disk Bytes/sec%