C++ 删除注册表项-MSDN示例中出现错误
MSDN文章应该演示如何删除具有子项的注册表项,但代码有缺陷 上面写着C++ 删除注册表项-MSDN示例中出现错误,c++,windows,registry,C++,Windows,Registry,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]; StringC
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文章是错误的……你会认为它们会被检查
关于如何纠正这个问题有什么想法吗
谢谢。仅仅改变是不够的。它后面的代码行:
if (!RegDelnodeRecurse(hKeyRoot, lpSubKey)) {
break;
也需要改变lpSubKey
需要替换为buf
,因为它现在包含完整密钥
不用说,但一定要在清理过程中释放(删除)buf
但是,为了保证正确性,似乎只需修改原始代码行以传递正确的长度(这应该是可以的,因为我认为注册表中的最大键长度是255)来修复原始代码行就更好了:
如果您不介意将
Shlwapi.dll
作为一个附加依赖项,那么只需使用它可能会更容易。如果您只针对Vista+(位于Advapi32.dll
)是另一种选择。是的,这是示例中的一个错误。应该是StringCchCopy(lpEnd,MAX_PATH*2-(lpEnd-lpSubKey),szName)
。或者更简单,*lpEnd=0;StringCchCat(lpSubKey,MAX_PATH*2,szName)
。很抱歉,我知道我已经将此标记为已解决,但遇到了一个问题。在我在HKEY_CURRENT_USER中制作的密钥上进行测试时,它工作正常,但在HKEY_LOCAL_计算机中尝试删除密钥时,它没有任何效果。@BillWalton您可能没有权限修改HKEY_LOCAL_计算机中的任何内容。如果这是您绝对必须执行的操作,您需要以提升的权限运行。您是否具有修改HKEY_LOCAL_计算机的权限?你需要以管理员的身份运行,所以只要我以管理员的身份登录,我就会拥有提升的权限吗?我注意到的一件奇怪的事情是,当我删除HKEY_CURRENT_USER 1中的键时,我从SHDeleteKey得到了相同的返回值,该键在winerror.h中定义为ERROR_INVALID_函数。但它仍然会删除HKEY_当前用户中的密钥,而不是HKEY_本地用户中的密钥_MACHINE@BillWalton,做管理员是不够的。您需要向程序添加清单,使其请求提升,并且每次启动程序时Windows都会显示UAC对话框。
StringCchCopy (lpEnd, MAX_PATH*2 - lstrlen(lpSubKey), szName);