问题描述
|
我想创建一个应用程序,其功能与regedit相同,但是更简单,因为我只想以树的形式枚举Keys。我试图使用RegOpenKeyEX打开一个键,然后使用RegEnumKeyex枚举它,但是即使我增加Index值,我仍会枚举相同的键。
第二个问题是,递归在此应用程序中会有所帮助。
提前致谢
解决方法
也许此代码示例将帮助您了解代码中出了什么问题:
http://msdn.microsoft.com/zh-CN/library/ms724256(v=vs.85).aspx。
至于第二个问题。递归可能会帮助您在此应用程序中构建通常在左侧regedit中看到的Keys树。
, 您可能不想为此使用递归。递归将遍历三个深度优先。您通常需要的是增量广度优先遍历。
通常,您将通过创建带有标准顶级节点(KHLM,HKCU等)的显示树并使用ѭ0tell来告诉它们每个节点都有子节点。
然后,当用户扩展节点时,您会收到TVN_ITEMEXPANDING通知。对此,您枚举了该节点下的一层项目,并将其插入到显示树中。再次,对于每个可能有子节点的用户,您都使用
I_CHILDRENCALLBACK
使其执行一个回调,该回调表明其具有子节点。
编辑:我还应该提到:您提到的第一个问题(似乎是反复枚举相同的项目)的一个常见原因是每次迭代都无法更新name参数的长度。它是一个输入/输出参数,该参数设置为每次调用时要检索的当前名称的长度。例如:
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,/* ... */);
// The next name is,say,\"YYYY\";
// `name` still contains \"XXX\":
// `len=3`,and \"YYYY\" won\'t fit into 3 characters.