如何轻松将 LPBYTE 转换为 char[256](用于从 Windows 注册表读取文本)

Posted

技术标签:

【中文标题】如何轻松将 LPBYTE 转换为 char[256](用于从 Windows 注册表读取文本)【英文标题】:How to easy convert LPBYTE to char[256] (used to read text from windows registry) 【发布时间】:2009-09-30 17:42:21 【问题描述】:

如何将 LPBYTE 转换为 char [256]?

当我从 Windows 注册表值读取时:

blah REG_SZ "blah some text"

char value[256];
DWORD keytype = REG_SZ;
DWORD dwCount = sizeof(value);
RegQueryValueEx((HKEY)key, "blah", 0, &keytype, (LPBYTE)&value, &count);
 cout << "Read text from registry: " << value << endl;

在 cout 之后它显示(截图):

http://i33.tinypic.com/dnja4i.jpg

(普通文字+一些符号)

我必须比较注册表中的值:

 if("blah some text" == value)
  cout << "Kk, good read from registry\n";

如何将此 LPBYTE 值转换为 char[256] ?

【问题讨论】:

如果这是在 C++ 中,为什么不直接使用 std::string 【参考方案1】:

来自MSDN:

如果数据有 REG_SZ, REG_MULTI_SZ 或 REG_EXPAND_SZ 类型, 该字符串可能尚未存储 具有适当的终止 null 人物。因此,即使 函数返回 ERROR_SUCCESS,即 应用程序应确保 字符串之前正确终止 使用它;否则,它可能会覆盖 一个缓冲区。 (注意 REG_MULTI_SZ 字符串应该有两个终止 空字符。)一种方式 应用程序可以确保字符串 正确终止是使用 RegGetValue,添加终止 如果需要,可以使用空字符。

查询完值后,应将 value[dwCount-1] 设置为 '\0' 以确保它以 null 结尾。

或者只使用RegGetValue,它消除了注册表 API 中的许多奇怪之处 - 保证以空值结尾的字符串,允许您指定预期的数据类型,否则会失败,自动扩展 REG_EXPAND_SZ,等等。

【讨论】:

当我添加 (LPBYTE) 值时,它会向我显示图像中的文本:i33.tinypic.com/dnja4i.jpg @Lisa 忽略我最初的回答 - 我一提交就知道这是错误的。 Ty Michael 我会尝试并写下它:)【参考方案2】:

RegQueryValueEx 调用之后,您需要在字符串末尾设置NUL-byte,使用dwCount 中的函数写入的值:

value[dwCount] = 0;

请注意,您不能使用 == 比较两个字符串,因为它们是指针,请使用 strcmp 函数来比较它们:

if (strcmp(value, "blah") == 0)
    puts("Strings are equal");

strcmp 可以在string.h 标头中找到)

【讨论】:

【参考方案3】:

我尝试从 Michaels 的答案中实现 RegGetVALue 函数,但编译后出现 Advapi32.dll 错误。 当我设置 value[dwCount] 并将字符串与 delroth 答案中的代码进行比较时,一切正常:) 谢谢迈克尔,delroth :)

【讨论】:

请不要回复其他答案 - 改为编辑您的原始问题。当您获得更多代表时,您也可以使用 cmets。

以上是关于如何轻松将 LPBYTE 转换为 char[256](用于从 Windows 注册表读取文本)的主要内容,如果未能解决你的问题,请参考以下文章

将 vector<char> buf(256) 转换为 LPCSTR?

Arduino中数据类型转换 float/double转换为char 亲测好使,dtostrf()函数

C++ 不推荐将字符串常量转换为 'char*'

如何在 C++ 中遍历 LPBYTE 的每个字节

编组 LPBYTE

Arduino中数据类型转换 float/double转换为char 亲测好使,dtostrf()函数