删除注册表项 - MSDN 示例中的错误

Posted

技术标签:

【中文标题】删除注册表项 - MSDN 示例中的错误【英文标题】:Deleting registry keys - error in MSDN sample 【发布时间】:2012-04-25 12:20:13 【问题描述】:

This MSDN 文章应该演示如何删除具有子项的注册表项,但代码存在缺陷。

上面写着的那一行

StringCchCopy (lpEnd, MAX_PATH*2, szName);

导致异常,这是由于试图复制到超出 lpEnd 的缓冲区。我尝试通过用以下内容替换该行来纠正解决方案

size_t subKeyLen = lstrlen(lpSubKey);
size_t bufLen = subKeyLen + lstrlen(szName)+1;
LPTSTR buf = new WCHAR[bufLen];
StringCchCopy(buf,bufLen,lpSubKey);
StringCchCopy(buf+subKeyLen,lstrlen(szName)+1,szName);
buf[bufLen-1]='\0';

由于目标平台和开发平台不同,我无法单步执行代码,但从我在代码中输入的日志来看,它看起来只是冻结了,但没有引发异常。

令人沮丧的是,MSDN 文章是错误的……你会认为它们会被检查。

关于如何纠正这个问题的任何想法?

谢谢。

【问题讨论】:

是的,这是示例中的错误。应该是StringCchCopy(lpEnd, MAX_PATH * 2 - (lpEnd - lpSubKey), szName)。或者更简单,*lpEnd = 0; StringCchCat(lpSubKey, MAX_PATH * 2, szName). 【参考方案1】:

如果您不介意将Shlwapi.dll 作为附加依赖项,则使用SHDeleteKey 可能更容易。如果您只针对 Vista+,RegDeleteTree(位于Advapi32.dll)是另一种选择。

【讨论】:

抱歉,我知道我已经将此标记为已解决,但我遇到了问题。当对我在 HKEY_CURRENT_USER 中创建的键进行测试时,它工作正常,但是当尝试删除 HKEY_LOCAL_MACHINE 中的键时,它没有效果。 @BillWalton 您可能无权修改 HKEY_LOCAL_MACHINE 中的任何内容。如果这是您绝对必须做的事情,您需要以提升的权限运行。 你有修改HKEY_LOCAL_MACHINE的权限吗?您需要以管理员身份运行 谢谢马克,所以只要我以管理员身份登录,我就会有提升的权限吗?我注意到的一件奇怪的事情是,当我删除 HKEY_CURRENT_USER, 1 中的键时,我从 SHDeleteKey 获得了相同的返回值——它在 winerror.h 中定义为 ERROR_INVALID_FUNCTION。然而它仍然删除了 HKEY_CURRENT_USER 中的键,而不是 HKEY_LOCAL_MACHINE 中的键 @BillWalton,作为管理员是不够的。您需要在程序中添加清单以使其请求提升,并且每次启动程序时 Windows 都会显示一个 UAC 对话框。【参考方案2】:

这种改变本身是不够的。后面的代码行:

        if (!RegDelnodeRecurse(hKeyRoot, lpSubKey)) 
            break;

也需要改变。 lpSubKey 需要替换为 buf,因为它现在包含完整的密钥。

这可能是不言而喻的,但一定要释放(删除)buf 作为清理的一部分。

但是,为了正确起见,似乎最好通过更改原始代码行来修复它以传递正确的长度(这应该没问题,因为我相信最大密钥注册表中的长度为 255):

StringCchCopy (lpEnd, MAX_PATH*2 - lstrlen(lpSubKey), szName);

【讨论】:

以上是关于删除注册表项 - MSDN 示例中的错误的主要内容,如果未能解决你的问题,请参考以下文章

删除注册表中的软件卸载项

如何解决处理深度技术Win10系统删除注册表项时出错问题

完美解决win注册表项无法删除

如何在不使用 C++ 中的 RegDeleteKeyEx 的情况下在 64 位树中删除 Windows x64 中的注册表项?

revit安装错误1618怎么在注册表删除

怎么删除桌面右键菜单项