我有一个用于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)
但这里有另一个问题是告诉" 入口点未找到 ".
你的函数导入失败,因为该功能被命名为SHDeleteKeyW其中W要使用Unicode字符指定.所以你的函数声明应该是
function SHDeleteKey(hKey: HKEY; pszSubKey: PWideChar): Integer; stdcall;
external 'shlwapi.dll' name 'SHDeleteKeyW';
Run Code Online (Sandbox Code Playgroud)
一旦修复,两种最常见的故障模式是:
根据您之前的问题,选项2似乎最有可能.
你说"什么也没发生",但我确信发生了一些事情.该功能失败并向您返回错误状态.但是你没有检查调用的返回值SHDeleteKey.每当您调用Windows API时,请检查返回值.如果失败,则返回值允许您诊断该失败.
假设问题是32位进程的注册表重定向器,您的选项包括:
RegDeleteTree.TRegistry.DeleteKey.请注意,您指定的代码KEY_WOW64_64KEY仅在使用TRegistry方法时有效.由于SHDeleteKey是Windows API函数,因此它独立于该类.