2016-08-28 60 views
-1

我想刪除使用Delphi的一個Windows鍵,但是沒有成功,下面我用刪除的RegistryKey Win64中/ 32

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; 

代碼在一些關鍵我可以刪除不止一個具有自己的註冊表編輯器我的訪問被拒絕的錯誤

我該如何解決這個問題?

編輯-----------------------

我試着做如下,但沒有成功

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; 

enter image description here

回答

5

您應該檢查iRet的值以瞭解更多信息。這是一個Win32錯誤代碼,它將提供有關失敗原因的更多詳細信息。

documentation

The subkey to be deleted must not have subkeys. To delete a key and all its subkeys, you need to enumerate the subkeys and delete them individually. To delete keys recursively, use the RegDeleteTree or SHDeleteKey function.

這是一個常見的故障模式,即你正在試圖刪除子項有子項本身。我不確定錯誤代碼是什麼,也許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碼這是令人失望的。請儘量堅持原來的問題。

+0

即使以管理員身份運行它不會擦除密鑰,註冊表擁有者(也以管理員身份運行)會返回以下錯誤: 「無法刪除所有指定的值」 – marcossys

+0

「您應該檢查iRet的值以瞭解更多信息「。 –

+0

我試圖做如下,但沒有成功 – marcossys