Delphi 删除注册表项Win64/32
我正在尝试使用Delphi删除一个Windows密钥,但是没有成功,它遵循我正在使用的代码Delphi 删除注册表项Win64/32,delphi,registry,Delphi,Registry,我正在尝试使用Delphi删除一个Windows密钥,但是没有成功,它遵循我正在使用的代码 Function DeleteKeyAPI(hRoot: HKEY; sPath: String; IsReg64: BOOL): BOOL; Var iRet: Integer; Begin If IsReg64 Then iRet := RegDeleteKeyEx(hRoot, PChar(sPath), KEY_WOW64_64KEY, 0) Else iRet :=
Function DeleteKeyAPI(hRoot: HKEY; sPath: String; IsReg64: BOOL): BOOL;
Var
iRet: Integer;
Begin
If IsReg64 Then
iRet := RegDeleteKeyEx(hRoot, PChar(sPath), KEY_WOW64_64KEY, 0)
Else
iRet := RegDeleteKeyEx(hRoot, PChar(sPath), KEY_WOW64_32KEY, 0);
If iRet = ERROR_SUCCESS Then
Result := True
Else
Result := False;
End;
在某些密钥中,我可以删除多个在自己的Regedit me中有拒绝访问错误的密钥
我如何解决这个问题
编辑-----------------------
我试着做如下事情,但没有成功
function SHDeleteKey(key: HKEY; pszSubKey: LPCTSTR): DWORD; stdcall;
implementation
{$R *.dfm}
function SHDeleteKey; external 'shlwapi.dll' name 'SHDeleteKeyA';
procedure TForm1.FormCreate(Sender: TObject);
begin
SHDeleteKey(HKEY_LOCAL_MACHINE, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run\AdobeCS6ServiceManager');
end;
您应该检查
iRet
的值以了解更多信息。这是一个Win32错误代码,将提供故障原因的更多详细信息
从:
要删除的子项不能有子项。要删除一个键及其所有子键,需要枚举子键并分别删除它们。要递归删除键,请使用RegDeleteTree或SHDeleteKey函数
这是一种常见的故障模式,即您试图删除的子项本身具有子项。我不确定错误代码是什么,可能是error\u DIR\u not\u EMPTY
另一种常见的故障模式是指定的子项不存在。这将导致错误代码error\u PATH\u NOT\u FOUND
或者error\u FILE\u NOT\u FOUND
最后,我想真正的问题是,您无法获得密钥的删除权限。由于您使用的是备用注册表标志,我怀疑您试图删除HKLM下的子项。您的流程需要足够的权限才能执行此操作。通常这意味着作为提升的管理员用户运行。如果您没有足够的权限,您将获得错误\u访问\u拒绝
关于您的编辑,
AdobeCS6ServiceManager
是一个值而不是一个键。您需要的函数是RegDeleteValue
。阅读有关注册表的信息,了解这些术语的含义:
此外,令人失望的是,您询问了一个关于
RegDeleteKeyEx
的问题,然后编辑以显示调用SHDeleteKey
的代码。请尽量坚持原来的问题。即使以管理员身份运行它也不会删除密钥,regedit own(也以管理员身份运行)会返回以下错误:“无法删除所有指定值”。如果找不到iRet
的值,则很难知道该说什么。您确定不可能获得该值吗?这是一个值而不是键。请不要再改变这个问题了。我的回答是准确的。你需要退后一步,停止随意的黑客攻击。认为了解键和值之间的区别。您正在尝试删除一个值。做些调查。不要疯狂地连枷。