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.