2016-03-17 1 views
-3

Всего нуб при кодировании, любые советы приветствуются.RegQueryValueEx, нужна помощь

Это то, что я пытаюсь сделать:

1) Откройте ключ запуска в HKLM

2) Прочитайте REG_SZ я сделал под названием "Test".

3) Прочитайте данные "Test"

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 << значение << '\ 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 реестра, могут не иметь нулевого окончания. Используйте значение, возвращаемое в 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, но я уверен, у вас нет прав администратора. В любом случае, отладка - это навык, которого вы не хватает. Когда функции выходят из строя, они возвращают коды ошибок. Вы их не проверяете. –