如何轻松将 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?