Создание приложения, похожего на regedit - PullRequest
0 голосов
/ 30 мая 2011

Я хочу создать приложение, которое выполняет те же функции, что и regedit, но проще, поскольку я просто хочу перечислить ключи в виде дерева.Я пытаюсь использовать RegOpenKeyEX, чтобы открыть ключ, а затем RegEnumKeyex, чтобы перечислить его, но я продолжаю получать один и тот же ключ, перечисленный, хотя я увеличиваю значение индекса.

Второй вопрос, будет ли рекурсия полезной вэто приложение.

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 31 мая 2011

Вы, вероятно, не хотите использовать для этого рекурсию. Рекурсия пройдет три глубины в первую очередь. То, что вы обычно хотите, - это пошаговый обход в ширину.

Обычно вы делаете это путем создания дерева отображения со стандартными узлами верхнего уровня (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.
1 голос
/ 30 мая 2011

Возможно, этот пример кода поможет вам понять, что пошло не так в вашем коде: http://msdn.microsoft.com/en-us/library/ms724256(v=vs.85).aspx.

Что касается второго вопроса.Рекурсия, вероятно, поможет вам в этом приложении, чтобы построить дерево ключей, которое вы обычно видите в regedit слева.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...