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

RegQueryValueEx返回异常:获取Edge卸载字符串得到WindowsSetup.exe求助

修复Microsoft Edge卸载字符串获取问题

问题原因

你看到WindowsSetup.exe是因为两个关键问题:

  • 缓冲区大小设置错误:RegQueryValueEx的dwSize参数按字节数计算,但你初始化为MAX_PATH(字符数)。在Unicode环境下,TCHAR是宽字符(占2字节),这导致缓冲区只能容纳MAX_PATH/2个字符,截断了完整的卸载命令。
  • Edge卸载命令的特殊性:Edge的卸载命令确实以WindowsSetup.exe开头,后续跟着卸载参数,但你的代码只读取了截断后的部分内容。

修复步骤

  1. 修正缓冲区大小初始化
    将dwSize初始化为sizeof(uninstallPath),确保能容纳完整的宽字符字符串(包含终止符)。

  2. 兼容不同位数的Edge路径
    64位系统中,64位Edge的卸载项路径是SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Edge(无需WOW6432Node),32位Edge才在WOW6432Node下。同时检查两个路径,提升兼容性。

修正后的代码

TCHAR uninstallPath[MAX_PATH];
// 初始化dwSize为缓冲区总字节数
DWORD dwSize = sizeof(uninstallPath);
DWORD dwType = REG_SZ;

HKEY edgeKey;
// 先尝试64位Edge的注册表路径
LONG result = RegOpenKeyW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Microsoft Edge", &edgeKey);
if (result != ERROR_SUCCESS) {
    // 失败则尝试32位Edge的路径
    result = RegOpenKeyW(HKEY_LOCAL_MACHINE, L"SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Microsoft Edge", &edgeKey);
    if (result != ERROR_SUCCESS) {
        ReportError();
        return;
    }
}

result = RegQueryValueExW(edgeKey, L"UninstallString", nullptr, &dwType, reinterpret_cast<BYTE*>(uninstallPath), &dwSize);
if (result != ERROR_SUCCESS) {
    ReportError();
    RegCloseKey(edgeKey);
    return;
}

// 关闭注册表键,避免资源泄漏
RegCloseKey(edgeKey);

MessageBoxW(nullptr, uninstallPath, L"Edge卸载命令", MB_OK);

额外说明

  • 修正后会获取完整的卸载命令,格式类似:C:\Windows\System32\WindowsSetup.exe /Uninstall "MicrosoftEdge",这是Edge真正的卸载执行命令。
  • 必须调用RegCloseKey关闭打开的注册表键,否则会造成系统资源泄漏。

内容的提问来源于stack exchange,提问作者Blaze

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:03:24