WinAPI删除Windows注册表键值对返回错误码2的问题求助
WinAPI删除Windows注册表键值对返回错误码2的问题求助
你遇到的这个问题我之前排查过好多次,咱们一步步拆解问题根源:
首先明确你的需求:你要删除的是SOFTWARE\Microsoft\Windows\CurrentVersion\Run下面的值项SampleMalware(对应值为abcdef),但你现在用的RegDeleteKeyA函数,是用来删除注册表的子键的,完全不是干这个活的工具!
这就是错误码2(系统找不到指定文件)的原因:RegDeleteKeyA会在你打开的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run键下面,去寻找名为SOFTWARE\Microsoft\Windows\CurrentVersion\Run\SampleMalware的子键——但这个子键根本不存在,你要删的是Run键下的一个值项,不是子键,函数找不到目标自然就报错了。
给你修正后的实现代码,同时补上你遗漏的句柄关闭操作(避免资源泄漏):
#include <Windows.h> #include <string> static const std::string REGISTRY_KEY_PATH = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"; LSTATUS DeleteSampleMalwareRegistryValue() { HKEY hKey; LSTATUS status = RegOpenKeyExA(HKEY_LOCAL_MACHINE, REGISTRY_KEY_PATH.c_str(), 0, KEY_SET_VALUE, &hKey); if (status != ERROR_SUCCESS) { return status; } // 用RegDeleteValueA删除目标值项,直接传入值项名称即可 status = RegDeleteValueA(hKey, "SampleMalware"); // 必须关闭打开的注册表键句柄,防止泄漏 RegCloseKey(hKey); return status; }
另外还有两个注意点要提醒你:
- 64位系统兼容性:如果你的程序是32位,在64位Windows上打开
HKEY_LOCAL_MACHINE\SOFTWARE会被自动重定向到Wow6432Node分支,如果你的SampleMalware值项实际在64位的Run键下,那打开键的时候要加上KEY_WOW64_64KEY权限标志,比如把RegOpenKeyExA的第四个参数改成KEY_SET_VALUE | KEY_WOW64_64KEY。 - 权限问题:操作
HKEY_LOCAL_MACHINE下的注册表项需要管理员权限,如果你的程序没有以管理员身份运行,可能会遇到权限不足的错误,这点也要排查。
内容来源于stack exchange
相关产品推荐
相关产品推荐

