Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除注册表项-MSDN示例中出现错误_C++_Windows_Registry - Fatal编程技术网

C++ 删除注册表项-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

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

关于如何纠正这个问题有什么想法吗


谢谢。

仅仅改变是不够的。它后面的代码行:

        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);