删除注册表项 - MSDN 示例中出现错误
Deleting registry keys - error in MSDN sample
这篇 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);
相关文章:
- 有没有任务栏API可以立即应用注册表更改
- 检查注册表项是否链接到(或副本)另一个注册表项
- 为什么我在空指针错误(链表)中获取成员访问权限
- 禁用地址共享注册表不起作用
- 如何从注册表项中提取配置单元和注册表名称
- 注册表正在设置 1 个字符
- 清理"QSettings"注册表项的最佳方法(Windows上的Qt 5)
- 在 c++ 中编辑注册表项
- 某些进程的注册表限制
- 在编译时生成某种子类/类型注册表?
- 如何测试注册表项是否存在?
- 注册表-获取值(而不是键)上次更改的时间和键创建日期
- 从注册表中检索已注销用户的 sid
- 如何正确检查 c++ 是否存在注册表项?
- 如何在不使用任何数据库的情况下制作动态注册表单?
- 强制资源管理器重新加载注册表值
- 注册表项版本ID在WOW6432Node下具有错误的值 - 故意还是错误?如何绕过
- C 为什么我的代码将注册表密钥放在错误的目录中
- 删除注册表项 - MSDN 示例中出现错误
- 奇怪的错误试图读取注册表值与Windows/ c++