3

这篇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 文章是错误的……你会认为它们会被检查。

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

谢谢。

4

2 回答 2

1

If you don't mind having Shlwapi.dll as an additional dependency, it may be easier for you just to use SHDeleteKey. If you're only targetting Vista+, RegDeleteTree (which lives in Advapi32.dll) is another alternative.

于 2012-04-25T13:11:17.483 回答
1

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

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

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

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

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

StringCchCopy (lpEnd, MAX_PATH*2 - lstrlen(lpSubKey), szName);
于 2012-04-25T12:35:40.963 回答