You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 09:23:00