Вы, вероятно, не хотите использовать для этого рекурсию. Рекурсия пройдет три глубины в первую очередь. То, что вы обычно хотите, - это пошаговый обход в ширину.
Обычно вы делаете это путем создания дерева отображения со стандартными узлами верхнего уровня (KHLM, HKCU и т. Д.) И используете I_CHILDRENCALLBACK
, чтобы сообщить ему, что у каждого из них есть дочерние узлы.
Затем, когда пользователь расширяет узел, вы получите уведомление TVN_ITEMEXPANDING. В ответ на это вы перечисляете ровно один уровень элементов под этим узлом и вставляете их в дерево отображения. Опять же, для каждого, у которого могут быть дочерние элементы, вы используете I_CHILDRENCALLBACK
, чтобы сделать обратный вызов, который говорит, что у него есть дочерние узлы.
Редактировать: Я должен также упомянуть: одной из распространенных причин первой проблемы, которую вы цитируете (похоже, неоднократно перечислялся один и тот же элемент), является невозможность обновления длины параметра имени на каждой итерации. Это параметр in / out, который устанавливается равным длине текущего имени, получаемого при каждом вызове. Например:
wchar_t name[256];
size_t len = sizeof(name)/sizeof(name[0]);
int i=0;
RegEnumKeyEx(root, i, name, &len, /* ... */);
// Now, name = "XXX", len = 3;
++i;
RegEnumKeyEx(root, i, name, &len, /* ... */);
// The next name is, say, "YYYY";
// `name` still contains "XXX":
// `len=3`, and "YYYY" won't fit into 3 characters.