www.pudn.com > UCtrl.rar > RegDelKey.pas


unit RegDelKey; 
{------------------------------------------------------------------------------/ 
//-- RegDelKeyExW 删除注册表的某一项,支持中文操作 
//-- RegDelKeyEx 删除注册表的某一项,不支持中文操作 
 
 type 
  TKeyInfo = record 
    Sum: Integer;   //子项数目 
    Len: Integer;   //子项最大长度 
  end; 
/------------------------------------------------------------------------------} 
interface 
 
uses Windows, SysUtils; 
 
type 
  TKeyInfo = record 
    Sum: Integer; 
    Len: Integer; 
  end; 
function RegDelKeyExW(RootKey: HKEY; KeyName: Widestring): Boolean; 
function RegDelKeyEx(RootKey: HKEY; KeyName: string): Boolean; 
 
function RegGetKeyEx(RootKey: HKEY; KeyName: string): string; 
function RegDelValue(RootKey: HKEY; SubKey: string; Name: string): Boolean; 
 
implementation 
 
//--GetKeyInfoW    获取子项数目和 子项中的最大长度------------------------------ 
 
function GetKeyInfoW(RootKey: HKEY; SubKey: Widestring; var Info: TKeyInfo): Boolean; 
var 
  NewKey: HKEY; 
begin 
  FillChar(Info, SizeOf(TKeyInfo), 0); 
  Result := RegOpenKeyExW(RootKey, PWideChar(SubKey), 0, Key_All_Access, NewKey) = Error_SUccess; 
  if Result then 
    Result := RegQueryInfoKeyW(NewKey, nil, nil, nil, @Info.Sum, @Info.Len, 
      nil, nil, nil, nil, nil, nil) = Error_SUccess; 
  if SysLocale.FarEast and (Win32Platform = VER_PLATFORM_WIN32_NT) then 
    Inc(Info.Len); 
  RegCloseKey(NewKey); 
end; 
 
function GetKeyInfo(RootKey: HKEY; SubKey: string; var Info: TKeyInfo): Boolean; 
var 
  NewKey: HKEY; 
begin 
  FillChar(Info, SizeOf(TKeyInfo), 0); 
  Result := RegOpenKeyEx(RootKey, PChar(SubKey), 0, Key_All_Access, NewKey) = Error_SUccess; 
  if Result then 
    Result := RegQueryInfoKey(NewKey, nil, nil, nil, @Info.Sum, @Info.Len, 
      nil, nil, nil, nil, nil, nil) = Error_SUccess; 
  if SysLocale.FarEast and (Win32Platform = VER_PLATFORM_WIN32_NT) then 
    Inc(Info.Len); 
  RegCloseKey(NewKey); 
end; 
 
//--GetActKeyW    取得活动句柄-------------------------------------------------- 
 
function GetActKeyW(RootKey: HKEY; KeyName: Widestring): HKEY; 
begin 
  RegOpenKeyExW(RootKey, PWideChar(KeyName), 0, Key_All_Access, Result); 
end; 
 
 
function GetActKey(RootKey: HKEY; KeyName: string): HKEY; 
begin 
  RegOpenKeyEx(RootKey, PChar(KeyName), 0, Key_All_Access, Result); 
end; 
 
//--RegDelKeyExW   删除注册表的某一项,支持中文操作------------------------------ 
 
function RegDelKeyExW(RootKey: HKEY; KeyName: Widestring): Boolean; 
var 
  Info: TKeyInfo; 
  SubKey: Widestring; 
  i: Integer; 
  Len: DWORD; 
  NewKey: HKEY; 
begin 
  if GetKeyInfoW(RootKey, KeyName, Info) then 
  begin 
    if Info.Sum > 0 then 
    begin 
      NewKey := GetActKeyW(RootKey, KeyName); 
      SetString(SubKey, nil, Info.Len + 1); 
      for i := Info.Sum - 1 downto 0 do 
      begin 
        Len := Info.Len + 1; 
        if RegEnumKeyExW(NewKey, DWORD(i), PWideChar(SubKey), Len, nil, nil, nil, nil) 
          = Error_SUccess then // 递归删除 ,从下而上 
          RegDelKeyExW(RootKey, WideFormat('%s\%s', [KeyName, PWideChar(SubKey)])); 
      end; 
      RegCloseKey(NewKey); 
    end; 
  end; // 需要导出的话可以从这里导出  if Result then Memo1.Lines.Add(KeyName); 
  Result := RegDeleteKeyW(RootKey, PWideChar(KeyName)) = Error_SUccess; 
end; 
 
function RegDelKeyEx(RootKey: HKEY; KeyName: string): Boolean; 
var 
  Info: TKeyInfo; 
  SubKey: string; 
  i: Integer; 
  Len: DWORD; 
  NewKey: HKEY; 
begin 
  if GetKeyInfo(RootKey, KeyName, Info) then 
  begin 
    if Info.Sum >= 0 then 
    begin 
      NewKey := GetActKey(RootKey, KeyName); 
      SetString(SubKey, nil, Info.Len + 1); 
      for i := Info.Sum - 1 downto 0 do 
      begin 
        Len := Info.Len + 1; 
        if RegEnumKeyEx(NewKey, DWORD(i), PChar(SubKey), Len, nil, nil, nil, 
          nil) = Error_SUccess then // 递归 
          RegDelKeyEx(RootKey, Format('%s\%s', [KeyName, PChar(SubKey)])); 
      end; 
      RegCloseKey(NewKey); 
    end; 
  end; 
  Result := RegDeleteKey(RootKey, PChar(KeyName)) = Error_SUccess; 
  //if Result then Memo1.Lines.Add(KeyName); 
end; 
 
 
function RegGetKeyEx(RootKey: HKEY; KeyName: string): string; 
var 
  Info: TKeyInfo; 
  SubKey: string; 
  i: Integer; 
  Len: DWORD; 
  NewKey: HKEY; 
begin 
  Result := ''; 
  if GetKeyInfo(RootKey, KeyName, Info) then 
  begin 
    if Info.Sum > 0 then 
    begin 
      NewKey := GetActKey(RootKey, KeyName); 
      SetString(SubKey, nil, Info.Len + 1); 
      for i := Info.Sum - 1 downto 0 do 
      begin 
        Len := Info.Len + 1; 
        if RegEnumKeyEx(NewKey, DWORD(i), PChar(SubKey), Len, nil, nil, nil, 
          nil) = Error_SUccess then // 递归 
          Result := Result + PChar(SubKey) + #10; 
      end; 
      Delete(Result, Length(Result), 1); 
      RegCloseKey(NewKey); 
    end; 
  end; 
end; 
{//--删除值,如果不存在或删除成功则返回True,否则返回False} 
 
function RegDelValue(RootKey: HKEY; SubKey: string; Name: string): Boolean; 
begin 
  Result := RegOpenKeyEx(RootKey, PChar(SubKey), 0, Key_All_Access, RootKey) = Error_SUccess; 
  if Result then 
    Result := RegDeleteValue(RootKey, PChar(Name)) = Error_SUccess 
  else 
    Result := True; 
  RegCloseKey(RootKey); 
end; 
 
end.