创建类似于regedit的应用程序

时间:2011-05-30 12:11:08

标签: windows winapi registry

我想创建一个与regedit相同的应用程序,但更简单,因为我只想以树的形式枚举键。我试图使用RegOpenKeyEX打开一个密钥,然后RegEnumKeyex枚举它,但我一直得到相同的枚举密钥,即使我正在递增索引值。

第二个问题是,递归会对此应用程序有所帮​​助。

提前致谢

2 个答案:

答案 0 :(得分:1)

也许这段代码示例可以帮助您了解代码中出现的问题: http://msdn.microsoft.com/en-us/library/ms724256(v=vs.85).aspx

至于第二个问题。递归可能会帮助您在此应用程序中构建您通常在左侧的regedit中看到的Keys树。

答案 1 :(得分:1)

您可能想要使用递归。递归将遍历三个深度优先。 通常想要的是增量广度优先遍历。

您通常会通过使用标准顶级节点(KHLM,HKCU等)创建显示树并使用I_CHILDRENCALLBACK来告诉它每个节点都有子节点。

然后,当用户展开节点时,您将收到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, i, name, &len, /* ... */);
// The next name is, say, "YYYY"; 
//    `name` still contains "XXX":
//        `len=3`, and "YYYY" won't fit into 3 characters.