2016-03-17 169 views
-3

在編碼時總noob,任何建議表示讚賞。RegQueryValueEx,需要一些幫助

這就是我要做的:

1)在HKLM

2打開運行鍵)讀取REG_SZ我做了所謂的「測試」。

3)閱讀發現然後刪除鍵 「測試」

4)如果 「這個數據」 的數據。

5)關閉密鑰。

我在做什麼錯?

#include <iostream> 
#include <Windows.h> 


using namespace std; 


int main() { 
char value[1024]; 
DWORD value_length = 1024; 
DWORD keytype = REG_SZ; 
HKEY hk; 
LONG result; 
LONG result2; 
char response; 
cout << "Would you like to scan? (Y) or (N)"; 
cin >> response; 
if (response == 'Y') 
{ 
    result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hk); 
     if (result == ERROR_SUCCESS) { 

      result2 = RegQueryValueEx(hk, ("Test"), NULL, &keytype, (LPBYTE)&value, &value_length); 
      if (result2 == ERROR_ACCESS_DENIED) { 
       cout << "Access Denied." << endl; 
       RegCloseKey(hk); 
       system("pause"); 

      } 
      else if (result2 == ERROR_MORE_DATA) { 
       cout << "lpData buffer is too small to receive the data." << endl; 
       RegCloseKey(hk); 
       system("pause"); 
      } 
      else if (result2 == ERROR_FILE_NOT_FOUND) { 
       cout << "Value does not exist for LpValueName." << endl; 
       RegCloseKey(hk); 
       system("pause"); 
      } 

      else if (result2 == ERROR_SUCCESS) { //If the function succeeds, the return value is ERROR_SUCCESS. 
       cout << "The value read from the registry is: " << value << endl; 
       RegCloseKey(hk); 
       system("pause"); 

      } 
     } 
     else if (result == ERROR_FILE_NOT_FOUND) 
     { 
      cout << "Key not found." << endl; 
      system("pause"); 
     } 
    } 

    else if (response == 'N') 
    { 
     return 0; 
     system("pause"); 
    } 
} 
+0

你試過'cout << value <<'\ n';看看它打印了什麼嗎? – Joel

+0

究竟是什麼問題?你已經知道如何讀取數據,你已經在做。數據在你的'value []'數組中。 'RegQueryValueEx()'(你忽略的)的返回值會告訴你該值是否存在於打開的鍵中,'value_length'將告訴你有多少字節被讀取。那麼你只需要根據你的需要掃描'value []'的內容,比如'strncmp()','strstr()'等等。如果找到匹配項,請調用RegDeleteValue()。 –

+0

在一個不相關的說明中,'ERROR_SUCCESS'是一個誤導性的名字! – CinCout

回答

2

您檢查RegOpenKeyEx返回的值的邏輯是相反的。只有返回ERROR_SUCCESS才能繼續。

if (RegOpenKeyEx(...) == ERROR_SUCCESS) 
    .... // go ahead 

您不檢查返回值爲RegQueryValueEx的錯誤。這可能是失敗的。

可能是因爲您沒有考慮到registry redirector而失敗。您試圖從註冊表的64位視圖讀取,但是您有32位過程,重定向器意味着您會看到32位視圖。將KEY_WOW64_64KEY標誌傳遞給RegOpenKeyEx以從64位視圖讀取。

請注意,從註冊表API函數返回的字符串可能不以null結尾。使用value_length中返回的值來顯式添加空終止符。

當您獲得讀取排序的密鑰的代碼時,您想刪除它。由於它在HKLM之下,因此您的過程必須以管理員權限運行。您必須使用具有足夠權限的訪問標記才能刪除,換句話說,這是更強大的KEY_READ

另外,由於您始終選擇使用ANSI API,因此使用宏指令TEXT會產生誤導。就個人而言,我會選擇Unicode API。

+0

好的,我認爲我正確地重寫了它。我一直在使用大量的在線教程來弄清楚這一點。我目前不需要64Key,因爲這不在WOW6432Node中。它位於HKLM \ Software \ Microsoft \ Windows \ Current Version \ Run中。 REG_SZ被命名爲「測試」。重新編譯後,現在我的程序只是退出,不管我選擇什麼選項。 – DropItLikeItsHot

+0

WOW6432Node是32位視圖。您需要從64位視圖讀取。就像我說的。你需要調試。 –

+0

你必須更加專注於我所說的話。現在你要求KEY_ALL_ACCESS,但我敢打賭你沒有管理員權限。無論如何,調試是你缺少的技能。當功能失敗時,它們會返回錯誤代碼。你不檢查他們。 –