RegEnumValue始终为最后一个值抛出ERROR_MORE_DATA

时间:2015-09-08 21:57:39

标签: c++ windows

无论如何,我对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);
当p = 2(最后一个索引值)时,

和retCode总是234。

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

非常感谢任何帮助。我对C ++很陌生,所以我可以忽略一些非常明显的东西。

1 个答案:

答案 0 :(得分:1)

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

  

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

RegQueryInfoKey只返回字符的值大小,因此是普通数据,没有字符串终止。

  

指向变量的指针,该变量接收密钥最长的变量   值名称,以Unicode字符表示。大小不包括   终止 null 字符。

ERROR_MORE_DATA 告诉您缓冲区太小。

你有:增加一个字符的缓冲区,为额外的终止腾出空间。