我试图删除使用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 := RegDeleteKeyEx(hRoot, PChar(sPath), KEY_WOW64_32KEY, 0);
If iRet = ERROR_SUCCESS Then
Result := True
Else
Result := False;
End;
Run Code Online (Sandbox Code Playgroud)
在某些键中,我可以删除多个自己的Regedit我的访问被拒绝错误
我该如何解决这个问题?
编辑-----------------------
我尝试按如下方式做,但没有成功
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;
Run Code Online (Sandbox Code Playgroud)
您应该检查价值iRet以了解更多信息.这是一个Win32错误代码,它将提供失败原因的更多详细信息.
从文档:
要删除的子项不能包含子项.要删除密钥及其所有子密钥,您需要枚举子密钥并单独删除它们.要以递归方式删除密钥,请使用RegDeleteTree或SHDeleteKey函数.
这是一种常见的故障模式,即您尝试删除的子项本身具有子项.我不确定错误代码是什么ERROR_DIR_NOT_EMPTY.
另一种常见的故障模式是命名子密钥不存在.那会导致错误代码ERROR_PATH_NOT_FOUND或者可能ERROR_FILE_NOT_FOUND.
最后,我猜是真正的问题,你无法获得密钥的删除权限.由于您使用备用注册表标志,我怀疑您正在尝试删除HKLM下的子项.您的流程需要足够的权限才能执行此操作.通常,这意味着作为提升的管理员用户运行.ERROR_ACCESS_DENIED如果您没有足够的权利,您将获得.
关于您的编辑,AdobeCS6ServiceManager是一个值而不是一个键.你需要的功能是RegDeleteValue.阅读注册表以了解这些术语的含义:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724182.aspx
此外,您提出一个问题RegDeleteKeyEx然后编辑以显示调用的代码是令人失望的SHDeleteKey.请尽量坚持原来的问题.