我想創建一個與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