0

我有一个用于 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;

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

function SHDeleteKey(key: HKEY; SubKey: PChar): Integer; stdcall; external 'shlwapi.dll';  

但这里还有一个问题是告诉“找不到入口点”。

4

2 回答 2

5

您的函数导入失败,因为该函数SHDeleteKeyWW指定您要使用 Unicode 字符的位置命名。所以你的函数声明应该是

function SHDeleteKey(hKey: HKEY; pszSubKey: PWideChar): Integer; stdcall; 
    external 'shlwapi.dll' name 'SHDeleteKeyW';

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

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

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

你说“什么都没有发生”,但我确定有些事情正在发生。该函数失败并向您返回错误状态。但是您没有检查对 . 的调用的返回值SHDeleteKey。每当您调用 Windows API 时,请检查返回值。如果失败,则返回值允许您诊断该失败。

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

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

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

于 2013-05-06T01:03:20.250 回答
0

对于第二个问题,您可能想尝试 ShDeleteKeyW (明确选择宽字符串变体)。

但是,在这两种情况下,您都应该检查结果以了解失败的原因。

您没有提及这是在什么 O/S 上,但此功能似乎有几个特定于平台的怪癖,可以在此处的评论中看到。

于 2013-05-05T20:55:20.747 回答