SHDeleteKey功能

use*_*284 0 delphi

我有一个用于Windows注册表操作的Delphi XE2项目.我需要删除**HKEY_CLASSES_ROOT\CLSID\{00000000-0000-0000-0000-000000000001}**下的所有子节点,所以我定义了以下代码:

function SHDeleteKey(key: HKEY; SubKey: PWideChar): Integer; stdcall; external 'shlwapi.dll' name 'SHDeleteKeyW';
..
..
..
..
..
procedure TMainForm.BitBtn02Click(Sender: TObject);
var
  RegistryEntry : TRegistry;
begin
  RegistryEntry := TRegistry.Create(KEY_READ or KEY_WOW64_64KEY);
  RegistryEntry.RootKey := HKEY_CLASSES_ROOT;
  if (RegistryEntry.KeyExists('CLSID\{00000000-0000-0000-0000-000000000001}\')) then
    begin
      Memo01.Font.Color := 3992580;
      Memo01.Lines.Add('Windows Registry Entry Has Been Found In Your System');
      RegistryEntry.Access:= KEY_WRITE or KEY_WOW64_64KEY;
      SHDeleteKey(HKEY_CLASSES_ROOT, PWideChar('CLSID\{00000000-0000-0000-0000-000000000001}'));
      RegistryEntry.CloseKey();
      RegistryEntry.Free;
      Memo01.Font.Color := 16756480;
      Memo01.Lines.Add('Windows Registry Entry Has Been Deleted Successfully');
    end
  else
    begin
      Memo01.Font.Color := 7864575;
      Memo01.Lines.Add('Windows Registry Entry Has Not Been Found In Your System');
    end;
end;
Run Code Online (Sandbox Code Playgroud)

但什么都没发生.然后我试过了

function SHDeleteKey(key: HKEY; SubKey: PChar): Integer; stdcall; external 'shlwapi.dll';  
Run Code Online (Sandbox Code Playgroud)

但这里有另一个问题是告诉" 入口点未找到 ".

Dav*_*nan 5

你的函数导入失败,因为该功能被命名为SHDeleteKeyW其中W要使用Unicode字符指定.所以你的函数声明应该是

function SHDeleteKey(hKey: HKEY; pszSubKey: PWideChar): Integer; stdcall; 
    external 'shlwapi.dll' name 'SHDeleteKeyW';
Run Code Online (Sandbox Code Playgroud)

一旦修复,两种最常见的故障模式是:

  1. 您的进程没有管理员权限.
  2. 您的进程在64位系统上以32位进程运行,因此无法看到注册表的64位视图.

根据您之前的问题,选项2似乎最有可能.

你说"什么也没发生",但我确信发生了一些事情.该功能失败并向您返回错误状态.但是你没有检查调用的返回值SHDeleteKey.每当您调用Windows API时,请检查返回值.如果失败,则返回值允许您诊断该失败.

假设问题是32位进程的注册表重定向器,您的选项包括:

  1. 从64位进程运行代码.
  2. 使用RegDeleteTree.
  3. 首先清空键的子键,然后使用TRegistry.DeleteKey.

请注意,您指定的代码KEY_WOW64_64KEY仅在使用TRegistry方法时有效.由于SHDeleteKey是Windows API函数,因此它独立于该类.