SHDeleteKey和RegDeleteTree有什么区别
What is the difference between SHDeleteKey and RegDeleteTree?
RegDeleteTree
-
描述:递归删除指定键的子项和值。
-
签名:
LONG WINAPI RegDeleteTree(HKEY, LPCTSTR)
-
最低支持:Vista
-
包括:
Winreg.h/Advapi32.lib
SHDeleteKey
-
说明:删除子项及其所有后代。此函数从注册表中删除项和所有项的值。
-
签名:
LSTATUS SHDeleteKey (HKEY, LPCTSTR)
-
支持的最低要求:XP
-
包括:
Shlwapi.h/Shlwapi.lib
看起来它们都用于递归删除注册表。并且它们的参数签名几乎相同。
RegDeleteTree
只是不同名称的SHDeleteKey
的改进版本吗?我应该更改为使用较新的RegDeleteTree
还是它们之间存在一些差异?
SHDeleteKey
和RegDeleteTree
之间的主要区别如下:
1( 他们删除注册表项的方式。例如:
SHDeleteKey(HKEY_CURRENT_USER, L"Software\Company\App\Settings");
将删除Settings
密钥中的所有内容,包括Settings
密钥本身。而:
RegDeleteTree(HKEY_CURRENT_USER, L"Software\Company\App\Settings");
将删除Settings
键中的所有内容,但Settings
键除外。它将保持为空。
2(RegDeleteTree
允许指定WOW64密钥重定向如下:
HKEY hKey = NULL;
if(RegOpenKeyEx(HKEY_CURRENT_USER,
L"Software\Classes\CLSID\{-my-guid-}", 0,
DELETE | KEY_ENUMERATE_SUB_KEYS | KEY_QUERY_VALUE | KEY_SET_VALUE |
KEY_WOW64_64KEY, //For WOW64, delete only 64-bit redirected part
&hKey) == ERROR_SUCCESS)
{
if(RegDeleteTree(hKey, NULL) == ERROR_SUCCESS)
{
//Deleted everything in HKEY_CURRENT_USERSoftwareClassesCLSID{-my-guid-}
}
RegCloseKey(hKey);
}
3( RegDeleteTree
与其他注册表函数驻留在同一个较低级别的 DLL 中,即 Advapi32.dll
,而SHDeleteKey
在Windows Shell的Shlwapi.dll
中。这种区别对于某些类型的服务可能很重要。
4( RegDeleteTree
在较旧的操作系统(如 Windows XP SP3、Server 2003(上不可用。它仅在 Vista 和 Server 2008 之后可用。
我直言,以及提供的文档,我认为区别是;
- API 移动到不同的 dll,原因可能是删除 OP 注释的单个功能的 shell 库依赖项。
- RegDeleteTree 需要您具有KEY_SET_VALUE权限,如果密钥具有任何值。
Christian.K给出的链接很好地总结了它。我在答案中包含了该博客的一些重要部分;
在过去的几个Windows版本中,有一个伟大的 已从 shell并转换为Win32核心API。 原因之一 这是正在进行的架构分层工作,由 核心操作系统部门的一些团队。
SHRegGetValue API是分层标记的API之一。 问题更适合核心操作系统功能 - 分层团队所做的分析表明,一些低水平 操作系统中的组件正在调用外壳 DLL 因为 shell 的帮助程序函数提供了一些方便 较低层中不存在的功能。
因此,许多 shell API 被重新创建为 kernel32 API。
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?