RegQueryValueEx()始终只返回字符串的4个字节

时间:2010-01-30 15:14:21

标签: c++ registry

这次我做错了什么?以下代码始终仅返回4个字节,而不是整个字符串:

HKEY hkey;
DWORD dwType, dwSize;

char keybuffer[512];

if(RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("software\\company name\\game name"), 0, KEY_READ, &hkey) == ERROR_SUCCESS){
    dwType = REG_SZ;
    dwSize = sizeof(keybuffer);
    RegQueryValueEx(hkey, TEXT("setting"), NULL, &dwType, (PBYTE)&keybuffer, &dwSize);
    RegCloseKey(hkey);
}

即使我将dwSize更改为任何内容,它仍将返回4个字节。

编辑:显然上面的代码中没有错误,但在其他地方-_-

4 个答案:

答案 0 :(得分:3)

我记得previous question中的注册表项名称。您在创建值时遇到问题。在该线程中,该值创建为DWORD,4个字节。这太巧合了。运行Regedit.exe并导航到您创建的密钥并检查值类型。如果它仍然是一个DWORD,那么即使你要求一个字符串,你也永远不会超过4个字节。

修复创建值的代码,确保创建REG_SZ,而不是REG_DWORD。在运行代码之前,使用Regedit.exe删除旧值。

答案 1 :(得分:1)

也许不是答案,但是......

  1. 您不需要指定dwType = REG_SZ,因为dwType是输出参数。
  2. 您可以使用NULL替换(PBYTE)& keybuffer来查看它需要多少空间
  3. 你确定HKEY_CURRENT_USER是正确的,还是LOCAL_MACHINE?如果你同时拥有CURRENT_USER和LOCAL_MACHINE,那么REG_SZ中的“设置”是什么?
  4. 检查RegQueryValueEx的返回值。

答案 2 :(得分:1)

(PBYTE)& keybuffer - 错了。必须是(PBYTE)keybuffer。

答案 3 :(得分:0)

我在这里看到了两个潜在的陷阱。首先,正如弗朗西斯所提到的,你应该检查返回值。 4个字节实际上对应于您期望的字符串字符吗?他们可能是什么。来自the documentation

  

如果lpData参数指定的缓冲区不足以容纳数据,则该函数返回ERROR_MORE_DATA并将所需的缓冲区大小存储在lpcbData指向的变量中。在这种情况下,lpData缓冲区的内容是未定义的。

第二个潜在的缺陷是你使用的char数组带有一个带TCHAR个参数的函数。如果您正在编译Unicode,编译器很乐意让您将宽字符串写入窄字符串缓冲区,因为转换为PBYTE。使用TCHAR一致或根本不使用它会更安全(即致电RegQueryValueExARegQueryValueExW)。