2010-08-27 60 views
1

以下代碼似乎不可靠地執行,並且在不確定的時間後,它將失敗,錯誤代碼234在RegEnumValue函數中。註冊表問題 - 使用C++刪除鍵/值

我還沒有寫這段代碼,我只是試圖去調試它。我知道在執行RegEnumValue時存在問題,然後在while循環中刪除鍵。

我想弄清楚爲什麼它在這個看起來隨機的點上拋出這個234錯誤,因爲它永遠不會在一致的循環迭代次數或類似的情況之後。

從我所看到的它沒有填寫它的名稱緩衝區,但這個緩衝區是不是太小,因此我不明白它是如何失敗?

有人請關於擺脫RegEnumValue函數拋出這個234錯誤的建議嗎?

HKEY key; 
    DWORD dw; 
    int idx; 
    char name[8192]; 
    DWORD namesize=4096; 
    std::string m_path = "SOFTWARE\\Company\\Server 4.0"; 

    if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,m_path.c_str(),0,KEY_ALL_ACCESS,&key) == ERROR_SUCCESS) 
    { 
     bool error=false; 
     idx=0; 
     long result; 
     long delresult; 
     while (true) 
     { 
      result = RegEnumValue(key,idx,(char*)name,&namesize,NULL,NULL,NULL,NULL); 

      if (result == ERROR_SUCCESS && !error){ 

       delresult = RegDeleteValue(key,name); 
       if (delresult != ERROR_SUCCESS) 
        error = true; 

       idx++; 
      } 
      else 
      { 
       break; 
      } 
     } 
     RegCloseKey(key); 
    } 

回答

3

有在你的代碼中的一些錯誤:

  1. RegEnumValue(在namesize)的4個參數是輸出參數。因此,您必須在的每個呼叫之前重置namesizesizeof(name)/sizeof(name[0])(在使用情況下,使用char型號,它僅爲sizeof(name)while迴路之內。這是你程序中的主要錯誤。
  2. 如果您不希望在有32,767個字符的緩衝區時發生ERROR_MORE_DATA錯誤。這是註冊價值的最大大小(請參閱RegEnumValue的文檔)。
  3. RegOpenKeyEx中使用KEY_ALL_ACCESS並不好。我會推薦你​​把它改爲KEY_QUERY_VALUE | KEY_SET_VALUE。這不是一個真正的錯誤,而是取決於你的環境。
  4. 如果最好使用UNICODE版本的所有這些函數來加快一點代碼。

已更新:只對UNICODE版本的用法有一點點評論。實習生Windows使用UNICODE字符。所以使用非Unicode版本的RegEnumValue si會更慢,因爲在evry調用一個新的UICODE memeory塊將被分配並轉換爲ANSI /多字節。此外,如果您將使用不能在您的Windows ANSI代碼頁(中文,日文等)中轉換的語言編寫的值名稱,並且某些字符將替換爲'?' (請參閱WC_DEFAULTCHAR標誌WideCharToMultiByte),則可能是功能RegDeleteValue將失敗,並顯示錯誤代碼,如「名稱不存在的值」。

0

答案是在該頁面的底部: http://msdn.microsoft.com/en-us/library/ms724865(VS.85).aspx

請閱讀的答案 「ERROR_MORE_DATA:?的lpData太小,或lpValueName太小」題。

+0

不能是lpData導致不使用它。 lpValueName可能是,但它已經有一個8192陣列緩衝區。它讓我感到困惑,可能太小了? – 2010-08-27 09:09:01

+0

有時它似乎把0字節放在lpValueName字符串的中間,所以它會切斷字符串的其餘部分... – 2010-08-27 09:12:31

+0

您將名稱設置爲4096. 您是否嘗試將其設置爲數組大小是8192? 該文檔說: 「指向一個變量的指針,該變量指定由lpValueName參數指向的緩衝區的大小,以字符形式。當函數返回時,變量將接收緩衝區中存儲的字符數,不包括終止空字符「。 – Zafer 2010-08-27 09:20:45

1

只是更改第四個參數的值,即從4096到8192的名稱。總是MakeSure它應該總是等於緩衝區大小。