C++ 返回无意义数据的RegKeyValue

C++ 返回无意义数据的RegKeyValue,c++,winapi,C++,Winapi,这是怎么回事 注意:RegKeyValue返回0您没有检查RegGetValue的返回值。很可能调用失败,缓冲区值从未分配任何内容。始终检查返回值 从我们可以看到的代码中,我注意到您在缓冲区大小方面撒谎。你说是8192字节。但您只分配了255个字节。您还调用了API的Unicode版本,但传入了一个字符缓冲区。如果需要字符串数据,则需要提供宽字符缓冲区。此API的Unicode版本将以UTF-16编码文本的形式返回字符串数据 一旦您得到所有排序,接下来需要检查该值中存储的类型。您正在为类型参数传

这是怎么回事


注意:RegKeyValue返回0

您没有检查RegGetValue的返回值。很可能调用失败,缓冲区值从未分配任何内容。始终检查返回值

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

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

您没有检查RegGetValue的返回值。很可能调用失败,缓冲区值从未分配任何内容。始终检查返回值

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

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

这里有两个问题

确保返回值为ERROR\u SUCCESS。如果不是,则例程失败。此外,您还可以检查写入BufferSize的内容,因为RegGetValue指定写入的字节数

您正在传入一个定义为char值[255];,然后将其长度指定为8192。这可能导致缓冲区溢出


这里有两个问题

确保返回值为ERROR\u SUCCESS。如果不是,则例程失败。此外,您还可以检查写入BufferSize的内容,因为RegGetValue指定写入的字节数

您正在传入一个定义为char值[255];,然后将其长度指定为8192。这可能导致缓冲区溢出


它返回错误\u成功,刚刚检查。我从一个据称有效的代码片段中复制了值[255]部分。我如何知道它需要设置为什么大小?@dsp_099您的大小应该与您指定的缓冲区大小匹配。如果您想通过8192,那么也要创建8192数组。另外,如果您使用的是unicode,您应该使用适当的字符类型,tooIt正在返回ERROR\u SUCCESS,刚刚选中。我从一个据称有效的代码片段中复制了值[255]部分。我如何知道它需要设置为什么大小?@dsp_099您的大小应该与您指定的缓冲区大小匹配。如果您想通过8192,那么也要创建8192数组。另外,如果您使用的是unicode,那么应该使用适当的字符类型,tooI应该使用WCHAR而不是char。谢谢我应该用WCHAR而不是char。谢谢
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;
    value   0x0034f50c "ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ...  char[255]