1
char value[255];
DWORD BufferSize = 8192;

RegGetValue(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", L"ProductName", RRF_RT_ANY, NULL, &value, &BufferSize);

cout << value;

RegKeyValue() 运行后,它的值似乎是

    value   0x0034f50c "ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ...  char[255]

这里发生了什么?

注意: RegKeyValue() 返回 0

4

2 回答 2

3

这里有两个问题。

  1. 确保RegGetValue的返回值为ERROR_SUCCESS. 如果不是,则例程失败。此外,您可以检查写入的内容BufferSizeRegGetValue指定写入的字节数。

  2. 您传入定义为 的缓冲区char value[255];,然后将其长度指定为8192。这可能会导致缓冲区溢出。

于 2013-01-20T22:56:04.640 回答
2

您没有检查RegGetValue. 很可能调用失败并且缓冲区value从未被分配任何东西。始终检查返回值。

从我们可以看到的代码中,我注意到您在缓冲区大小上撒谎。你说它是8192字节。但是您只分配了 255 个字节。您还调用了 API 的 Unicode 版本,但传入了一个char缓冲区。如果您期待字符串数据,那么您需要提供一个宽字符缓冲区。此 API 的 Unicode 版本将字符串数据作为 UTF-16 编码文本返回。

完成所有排序后,接下来需要检查该值中存储的类型。您正在为类型参数传递 NULL。传递一个指向变量的指针并找出一个字符串是否真的存储在那里。您还需要读取读取了多少字节并相应地在缓冲区中设置空终止符。

于 2013-01-20T22:53:00.077 回答