RegKeyValue返回无意义的数据

时间:2013-01-20 22:51:25

标签: c++ winapi

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

2 个答案:

答案 0 :(得分:3)

这里有两个问题。

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

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

答案 1 :(得分:2)

您没有检查RegGetValue的返回值。最有可能的是调用失败,缓冲区value从未被分配任何东西。始终检查返回值。

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

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