2011-05-30 52 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

相關問題