2016-03-17 27 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,但我敢打赌你没有管理员权限。无论如何,调试是你缺少的技能。当功能失败时,它们会返回错误代码。你不检查他们。 –