编码时的总菜鸟,任何建议都表示赞赏。
这就是我想要做的事情:
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 :(得分: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。