RegEnumValue总是为最后一个值抛出ERROR_MORE_DATA

RegEnumValue always throws ERROR_MORE_DATA for last value

本文关键字:ERROR MORE DATA 最后一个 RegEnumValue      更新时间:2023-10-16

无论如何,我对RegEnumValue的调用总是在键的最后一个值上返回ERROR_MORE_DATA(234)。

我通过使用

获得所需的缓冲区大小:
retCode = RegQueryInfoKey(hSubKey,          // key handle
                                      NULL,             // buffer for class name
                                      NULL,             // size of class string
                                      NULL,             // reserved
                                      NULL,             // number of subkeys
                                      NULL,             // longest subkey length
                                      NULL,             // longest class string 
                                      &valueCount,      // number of values for this key 
                                      &cLongestValue,   // longest value name 
                                      NULL,             // longest value data 
                                      NULL,             // security descriptor 
                                      NULL);            // last write time

然后分配数组:

currentValueName = new WCHAR[(int)cLongestValue];

然后我试着得到值:

retCode = RegEnumValue(hSubKey, j, currentValueName, &cLongestValue, NULL, NULL, NULL, NULL);

和retCode总是234时,j = 2(最后一个索引值)。

为什么我总是得到ERROR_MORE_DATA?对于键中的前两个值,它可以正常工作。

非常感谢任何帮助。我是c++的新手,所以我可能忽略了一些非常明显的东西

RegEnumValue,第3个参数(lpValueName [out]):

指向缓冲区的指针,该缓冲区接收值的名称终止字符串。此缓冲区必须足够大以包含终止null字符。

RegQueryInfoKey只返回以字符为单位的值大小,所以是普通数据,没有字符串终止。

指向接收键最长长度的变量的指针值名称,以Unicode字符表示。尺寸不包括终止null字符。

ERROR_MORE_DATA告诉你缓冲区太小了。

就是这样:增加一个字符的缓冲区来为额外的结束符腾出空间。

相关文章: