这两个注册表程序有问题吗?为什么在我的电脑上老是提示删除失败。(100分)

  • 主题发起人 stevenldj
  • 开始时间
S

stevenldj

Unregistered / Unconfirmed
GUEST, unregistred user!
//删除注册表项
procedure uDelRegKey(sKeyName: String);
var
rReg: TRegistry;
sRootKey: String;
sKeyPath: String;
sSubKeyName: String;
begin
//格式化
if sKeyName[Length(sKeyName)] = '/' then
Delete(sKeyName, Length(sKeyName), 1);
//读取根键
sRootKey := UpperCase(Copy(sKeyName, 1, Pos('/', sKeyName) - 1));
//读取键名
sSubKeyName := Copy(sKeyName, uSubPos('/', sKeyName, 0) + 1, MaxInt);
//读取路径
sKeyPath := Copy(sKeyName, Length(sRootKey) + 2, MaxInt);
Delete(sKeyPath, uSubPos('/', sKeyPath, 0), MaxInt);
//操作注册表
rReg := TRegistry.Create;
try
rReg.RootKey := DWORD($80000000) + DWORD(slRegRootKey.IndexOf(sRootKey));
if rReg.KeyExists(sKeyPath) then begin
rReg.OpenKey(sKeyPath,False);
if not rReg.DeleteKey(sSubKeyName) then
slError.Add('注册表项-删除失败 ' + sKeyName);
rReg.CloseKey;
end;
finally
rReg.Free;
end;
end;

//删除注册表键值
procedure uDelRegValue(sValueName: String);
var
rReg: TRegistry;
sRootKey: String;
sKeyPath: String;
sSubKeyName: String;
begin
//格式化
if sValueName[Length(sValueName)] = '/' then
Delete(sValueName, Length(sValueName), 1);
//读取根键
sRootKey := UpperCase(Copy(sValueName, 1, Pos('/', sValueName) - 1));
//读取键名
sSubKeyName := Copy(sValueName, uSubPos('/', sValueName, 0) + 1, MaxInt);
//读取路径
sKeyPath := Copy(sValueName, Length(sRootKey) + 2, MaxInt);
Delete(sKeyPath, uSubPos('/', sKeyPath, 0), MaxInt);
//操作注册表
rReg := TRegistry.Create;
try
rReg.RootKey := DWORD($80000000) + DWORD(slRegRootKey.IndexOf(sRootKey));
if rReg.KeyExists(sKeyPath) then begin
rReg.OpenKey(sKeyPath,False);
if not rReg.DeleteValue(sSubKeyName) then
slError.Add('注册表值-删除失败 ' + sValueName);
rReg.CloseKey;
end;
finally
rReg.Free;
end;
end;

执行结果如下:

执行结果:(未删除的文件或目录将在下次启动时被删除)
注册表项-删除失败 HKEY_CLASSES_ROOT/CLSID/{7CA83CF1-3AEA-42D0-A4E3-1594FC6E48B2}
注册表项-删除失败 HKEY_CLASSES_ROOT/CLSID/{ABEC6103-F6AC-43A3-834F-FB03FBA339A2}
注册表项-删除失败 HKEY_CLASSES_ROOT/CLSID/{B83FC273-3522-4CC6-92EC-75CC86678DA4}
注册表项-删除失败 HKEY_CLASSES_ROOT/CnsHelper.CH
注册表项-删除失败 HKEY_CLASSES_ROOT/CnsHelper.CH.1
注册表项-删除失败 HKEY_CLASSES_ROOT/TypeLib/{4158DB95-DE71-41FF-BEA1-2C3D1C679DF1}
注册表项-删除失败 HKEY_CLASSES_ROOT/TypeLib/{F97E75A4-0103-4F27-A752-327B600B1130}
注册表项-删除失败 HKEY_CLASSES_ROOT/TypeLib/{F9AD9D67-EFA8-480E-8291-0163F3960DE7}
注册表项-删除失败 HKEY_CURRENT_USER/Software/yahoo
注册表值-删除失败 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Internet Explorer/Search
注册表值-删除失败 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run/helper.dll
注册表项-删除失败 HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/CnsMinKP
注册表项-删除失败 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/CnsMinKP


我用的是 Delphi10_Lite_v3.0_SP1_Integrated
 
还有代码:
slRegRootKey := TStringList.Create;
slRegRootKey.Add('HKEY_CLASSES_ROOT');
slRegRootKey.Add('HKEY_CURRENT_USER');
slRegRootKey.Add('HKEY_LOCAL_MACHINE');
slRegRootKey.Add('HKEY_USERS');
slRegRootKey.Add('HKEY_PERFORMANCE_DATA');
slRegRootKey.Add('HKEY_CURRENT_CONFIG');
slRegRootKey.Add('HKEY_DYN_DATA');

我觉得代码没问题呀,可就是删不掉注册表的内容,用手工删都能删掉的。
我跟踪了代码,发现都是这里出的问题,任何时候都是删除失败。
if not rReg.DeleteKey(sSubKeyName) then
slError.Add('注册表项-删除失败 ' + sKeyName);
其他执行都正常。
 
路过学习 帮你顶
 
那是程序自己不具备超级管理员权限
 
那要怎么使程序获得超级管理员权限,或者有没有别的方法删除注册表项。
我用的是 Win XP 系统,很烦那个3721,想写个东东自动把它清理掉,可是注册表操作老是失败,谁能给些建议呢?
 
我也碰到过这样的问题,手动删除注册表会出错,即使有权限也不行。我下了个软件,ewido,可以删除注册表里的木马病毒,老兄可以试一下。
 
谢谢 babibean,ewido 不错,能删掉很多类似 3721 的病毒。不过我想编写一个能删除任何文件和注册表项的软件。

我想知道为什么上面的过程不能删除注册表项,而手工就可以删除,有谁可以帮忙测试一下吗?

过程中用到了一个自定义函数,如下:
//找出在指定的字符串(S)中,某个字符串(SubStr)的第Num次出现时的字符位置,
//Num为0则表示求最后一次出现的位置。
function uSubPos(const SubStr: string; S: string; Num: Integer): Integer;
var
i, n: Integer;
begin
i := 1; //保存"子字符串"在"字符串"中的第一次出现位置
n := 0; //计数器,保存已找到的"子字符串"个数
Result := 0;
while i <> 0 do begin //i <> 0 表示 S 中还有 SubStr 了,就接着循环
if (Num > 0) and (n = Num) then Break; //看是否还需要判断
i := Pos(SubStr, S); //判断 SubStr 在当前 S 中的位子(因为 S 是不断减小的),结果赋给 i
Result := Result + i; //将 i 的值加到 Result 中
S := Copy(S, i + 1, 255); //将 S 中判断过的内容去掉,未判断过的内容重新赋值给 S
n := n + 1; //判断出一个就将 n 值增加 1
end;
end;

谢谢了!!!!!!!
 
我把代码改了一下,问题解决了。

//删除注册表项 或 值
//sKeyName要删除的项目
//ValueOrKey标记删除的是 Value 还是 Key,True表 示删除Value
procedure uDelRegItem(sKeyName: String; ValueOrKey: Boolean = True);
var
rReg: TRegistry;
sRootKey: String;
sKeyPath: String;
sSubKeyName: String;
begin
//格式化
if sKeyName[Length(sKeyName)] = '/' then
Delete(sKeyName, Length(sKeyName), 1);
//读取根键
sRootKey := UpperCase(Copy(sKeyName, 1, Pos('/', sKeyName) - 1));
//读取键名
sSubKeyName := Copy(sKeyName, uSubPos('/', sKeyName, 0) + 1, MaxInt);
//读取路径
sKeyPath := sKeyName;
Delete(sKeyPath, 1, Length(sRootKey) + 1);
if Pos('/', sKeyPath) = 0 then
sKeyPath := ''
else
Delete(sKeyPath, uSubPos('/', sKeyPath, 0), Length(sSubKeyName) + 1);
//操作注册表
rReg := TRegistry.Create;
try
rReg.RootKey := DWORD($80000000) + DWORD(slRegRootKey.IndexOf(sRootKey));
if rReg.KeyExists(sKeyPath + '/' + sSubKeyName) then begin
if sKeyPath <> '' then rReg.OpenKey(sKeyPath,False);
if ValueOrKey then begin
if not rReg.DeleteValue(sSubKeyName) then
slError.Add('注册表值-删除失败 ' + sKeyName);
end
else
begin
if not rReg.DeleteKey(sSubKeyName) then
slError.Add('注册表项-删除失败 ' + sKeyName);
end;
rReg.CloseKey;
end;
finally
rReg.Free;
end;
end;
 
顶部