RegQueryValueEx返回异常:获取Edge卸载字符串得到WindowsSetup.exe求助
修复Microsoft Edge卸载字符串获取问题
问题原因
你看到WindowsSetup.exe是因为两个关键问题:
- 缓冲区大小设置错误:
RegQueryValueEx的dwSize参数按字节数计算,但你初始化为MAX_PATH(字符数)。在Unicode环境下,TCHAR是宽字符(占2字节),这导致缓冲区只能容纳MAX_PATH/2个字符,截断了完整的卸载命令。 - Edge卸载命令的特殊性:Edge的卸载命令确实以
WindowsSetup.exe开头,后续跟着卸载参数,但你的代码只读取了截断后的部分内容。
修复步骤
修正缓冲区大小初始化
将dwSize初始化为sizeof(uninstallPath),确保能容纳完整的宽字符字符串(包含终止符)。兼容不同位数的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
相关产品推荐
相关产品推荐

