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

Deleting registry keys - error in MSDN sample

本文关键字:错误 注册表 MSDN 删除      更新时间:2023-10-16

这篇 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]='';

由于目标平台和开发平台不同,我无法单步执行代码,但从我放入代码的日志记录来看,它看起来只是冻结,但不会引发异常。

令人

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

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

谢谢。

如果您不介意将Shlwapi.dll作为额外的依赖项,那么使用 SHDeleteKey 可能会更容易。如果你只针对Vista+,RegDeleteTree(住在Advapi32.dll)是另一种选择。

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

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

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

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

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

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