删除注册表项 - 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 示例中的错误的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用 C++ 中的 RegDeleteKeyEx 的情况下在 64 位树中删除 Windows x64 中的注册表项?