2011-05-30 53 views
0

我想创建一个与regedit具有相同内容的应用程序,但更简单,因为我只是想以树的形式枚举Keys。我试图使用RegOpenKeyEX打开一个键,然后RegEnumKeyex枚举它,但我仍然得到相同的枚举键,即使我正在增加索引值。创建类似于注册表的应用程序

第二个问题是,在这个应用程序中,递归会有帮助。

在此先感谢

+4

请发布您的代码,最好简化为只调用两次'RegOpenKeyEx'和'RegEnumKeyEx'。否则,我们可以猜测出了什么问题以及为什么。 – phihag 2011-05-30 12:14:51

回答

1

你可能不要想为此使用递归。递归将遍历三个深度优先。 通常想要的是增量宽度优先遍历。

通常通过创建带有标准顶级节点(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. 
+0

非常感谢,那正是我犯的错误。你说得对,递归在这里不是一个好的选择。 – 2011-05-31 03:57:46

+0

嘿!只是想补充,我尝试了递归和迭代方法来解决问题。递归一旦开始枚举所有注册表项,递归速度就会变慢。如果我通过使用TVN_ITEMEXPANDING事件来枚举键,它会更有效率。 – 2011-06-01 09:53:13

相关问题