2013-04-23 115 views
2

我想刪除一個註冊表密鑰,但是在此代碼中,我始終得到Returnvalue 2(找不到文件),但路徑等於參數。從註冊表中刪除密鑰

HKEY hKey; 
long lReturn = RegOpenKeyEx(HKEY_CURRENT_USER, 
          _T("test1\\test2\\test3"), 
          0L, 
          KEY_ALL_ACCESS, 
          &hKey); 
lReturn = RegDeleteValue(hKey,(LPCWSTR)"value1"); 
lReturn = RegDeleteValue(hKey,(LPCWSTR)"value2"); 

lReturn = RegDeleteKey(hKey,(LPCWSTR)"test1\\test2\\test3"); 
lReturn = RegDeleteKey(hKey,(LPCWSTR)"test1\\test2"); 
lReturn = RegCloseKey(hKey); 

,如果我RegDeleteKey參數更改爲:

lReturn = RegDeleteKey(HKEY_LOCAL_MACHINE,(LPCWSTR)"test1\\test2\\test3"); 

我得到的返回值5(沒有權限)。請幫我刪除這個Registryentry。

回答

4

將字符串文字類型轉換爲LPCWSTR不會將其轉換爲該類型。它只是告訴編譯器,儘管文字的真實類型,你知道更好,它應該被視爲另一種類型。編譯器不檢查你是否在說真話,在這種情況下,你錯了。

如果你想有一個寬字符字符串文字,使用L前綴,否則使用_T宏就像你在第一個聲明沒有:

lReturn = RegDeleteValue(hKey, L"value1"); 
lReturn = RegDeleteValue(hKey, _T("value1")); 

操作系統是正確返回2,因爲值你指着真的不可能被發現。通過類型轉換爲LPCWSTR,該函數期望指針指向一個雙字節字符序列。不過,你給了它一個單字節字符序列。它讀取第一對字節並將其視爲單個字符。它讀取'va''te'作爲單個字符,找不到名稱以此類字符開頭的值或鍵,並且失敗。

當使用前綴L時,通常也明確使用API​​函數的版本,以便選擇函數不會對UNICODE宏的狀態敏感。

lReturn = RegDeleteValueW(hKey, L"value1"); 
1

只是鑄造一個字符串轉換爲寬字符串是不正確的

(LPCWSTR) 「測試1 \ TEST2 \ TEST3」

使用L 「測試1 \ TEST2 \ TEST3」

2

您正在濫用類型轉換,並且您將錯誤的參數值傳遞給RegDeleteKey()。試試這個:

HKEY hKey = NULL; 
long lReturn = RegOpenKeyEx(HKEY_CURRENT_USER, 
          _T("test1\\test2\\test3"), 
          0L, 
          KEY_SET_VALUE, 
          &hKey); 
if (lReturn == ERROR_SUCCESS) 
{ 
    lReturn = RegDeleteValue(hKey, _T("value1")); 
    lReturn = RegDeleteValue(hKey, _T("value2")); 
    lReturn = RegCloseKey(hKey); 
} 

lReturn = RegDeleteKey(HKEY_CURRENT_USER, _T("test1\\test2\\test3")); 
lReturn = RegDeleteKey(HKEY_CURRENT_USER, _T("test1\\test2")); 

順便說一句,如果你要刪除test3關鍵反正那麼就沒有必要打開鍵和刪除單個值從它。刪除密鑰會自動刪除您的所有密鑰值。您只需刪除子項(如果有的話),如在刪除test2密鑰之前刪除test3密鑰。