无论如何,我对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 ++很陌生,所以我可以忽略一些非常明显的东西。
答案 0 :(得分:1)
RegEnumValue,第三个参数( lpValueName [out] ):
指向缓冲区的指针,该缓冲区接收值的名称 null - 终止字符串。此缓冲区必须足够大才能包含 终止 null 字符。
RegQueryInfoKey只返回字符的值大小,因此是普通数据,没有字符串终止。
指向变量的指针,该变量接收密钥最长的变量 值名称,以Unicode字符表示。大小不包括 终止 null 字符。
ERROR_MORE_DATA 告诉您缓冲区太小。
你有:增加一个字符的缓冲区,为额外的终止腾出空间。