我想创建一个与regedit具有相同内容的应用程序,但更简单,因为我只是想以树的形式枚举Keys。我试图使用RegOpenKeyEX打开一个键,然后RegEnumKeyex枚举它,但我仍然得到相同的枚举键,即使我正在增加索引值。创建类似于注册表的应用程序
第二个问题是,在这个应用程序中,递归会有帮助。
在此先感谢
我想创建一个与regedit具有相同内容的应用程序,但更简单,因为我只是想以树的形式枚举Keys。我试图使用RegOpenKeyEX打开一个键,然后RegEnumKeyex枚举它,但我仍然得到相同的枚举键,即使我正在增加索引值。创建类似于注册表的应用程序
第二个问题是,在这个应用程序中,递归会有帮助。
在此先感谢
也许此代码示例将帮助您了解什么地方出了问题代码: http://msdn.microsoft.com/en-us/library/ms724256(v=vs.85).aspx。
至于第二个问题。递归可能会帮助你在这个应用程序中建立你通常在左边注册表中看到的Keys树。
你可能不要想为此使用递归。递归将遍历三个深度优先。 通常想要的是增量宽度优先遍历。
通常通过创建带有标准顶级节点(KHLM,HKCU等)的显示树并使用I_CHILDRENCALLBACK
来告诉它每个节点都有子节点。
然后,当用户展开节点时,您将收到TVN_ITEMEXPANDING通知。为此,您只需枚举该节点下的一个级别的项目并将它们插入到显示树中。同样,对于每个可能有孩子的人,你使用I_CHILDRENCALLBACK
来做一个回调,说明它有子节点。
编辑:我还应该提到:引用第一个问题的一个常见原因(似乎重复枚举同一个项目)无法在每次迭代中更新名称参数的长度。这是一个输入/输出参数,它被设置为每次调用时检索的当前名称的长度。例如:
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.
非常感谢,那正是我犯的错误。你说得对,递归在这里不是一个好的选择。 – 2011-05-31 03:57:46
嘿!只是想补充,我尝试了递归和迭代方法来解决问题。递归一旦开始枚举所有注册表项,递归速度就会变慢。如果我通过使用TVN_ITEMEXPANDING事件来枚举键,它会更有效率。 – 2011-06-01 09:53:13
请发布您的代码,最好简化为只调用两次'RegOpenKeyEx'和'RegEnumKeyEx'。否则,我们可以猜测出了什么问题以及为什么。 – phihag 2011-05-30 12:14:51