SHDeleteKey和RegDeleteTree有什么区别

What is the difference between SHDeleteKey and RegDeleteTree?

本文关键字:什么 区别 RegDeleteTree SHDeleteKey      更新时间:2023-10-16

RegDeleteTree

  • 描述:递归删除指定键的子项和值。

  • 签名:LONG WINAPI RegDeleteTree(HKEY, LPCTSTR)

  • 最低支持:Vista

  • 包括:Winreg.h/Advapi32.lib

SHDeleteKey

  • 说明:删除子项及其所有后代。此函数从注册表中删除项和所有项的值。

  • 签名:LSTATUS SHDeleteKey (HKEY, LPCTSTR)

  • 支持的最低要求:XP

  • 包括:Shlwapi.h/Shlwapi.lib

看起来它们都用于递归删除注册表。并且它们的参数签名几乎相同。

RegDeleteTree只是不同名称的SHDeleteKey的改进版本吗?我应该更改为使用较新的RegDeleteTree还是它们之间存在一些差异?

SHDeleteKeyRegDeleteTree之间的主要区别如下:

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。