这次我做错了什么?以下代码始终仅返回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个字节。
编辑:显然上面的代码中没有错误,但在其他地方-_-
答案 0 :(得分:3)
我记得previous question中的注册表项名称。您在创建值时遇到问题。在该线程中,该值创建为DWORD,4个字节。这太巧合了。运行Regedit.exe并导航到您创建的密钥并检查值类型。如果它仍然是一个DWORD,那么即使你要求一个字符串,你也永远不会超过4个字节。
修复创建值的代码,确保创建REG_SZ,而不是REG_DWORD。在运行代码之前,使用Regedit.exe删除旧值。
答案 1 :(得分:1)
也许不是答案,但是......
答案 2 :(得分:1)
(PBYTE)& keybuffer - 错了。必须是(PBYTE)keybuffer。
答案 3 :(得分:0)
我在这里看到了两个潜在的陷阱。首先,正如弗朗西斯所提到的,你应该检查返回值。 4个字节实际上对应于您期望的字符串字符吗?他们可能是什么。来自the documentation:
如果lpData参数指定的缓冲区不足以容纳数据,则该函数返回ERROR_MORE_DATA并将所需的缓冲区大小存储在lpcbData指向的变量中。在这种情况下,lpData缓冲区的内容是未定义的。
第二个潜在的缺陷是你使用的char
数组带有一个带TCHAR
个参数的函数。如果您正在编译Unicode,编译器很乐意让您将宽字符串写入窄字符串缓冲区,因为转换为PBYTE
。使用TCHAR
一致或根本不使用它会更安全(即致电RegQueryValueExA
或RegQueryValueExW
)。