1

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

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

废话 REG_SZ "废话一些文本"

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] ?

4

3 回答 3

3

来自MSDN

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

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

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

于 2009-09-30T17:46:27.843 回答
2

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

value[dwCount] = 0;

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

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

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

于 2009-09-30T17:55:36.070 回答
0

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

于 2009-09-30T18:14:59.353 回答