嘗試在 Windows 注冊表中寫入值時,出現“無法為“Value1”設定資料”錯誤。我嘗試以管理員身份運行該程式,手動創建密鑰并將“所有人”的密鑰權限設定為完全訪問權限。但錯誤仍然存??在
我已經使用以下代碼來撰寫值:
var
Registry: TRegistry;
begin
Registry := TRegistry.Create(KEY_READ);
Registry.RootKey := HKEY_LOCAL_MACHINE;
// False because otherwise it would create a new key
try
if not Registry.OpenKey(KeyLocation, True) then RaiseLastOSError;
Registry.WriteString('Value1', 'text123');
finally
Registry.Free;
end;
end;
我該如何解決這個問題?
uj5u.com熱心網友回復:
您正在嘗試將注冊表寫入注冊表的HKEY_LOCAL_MACHINE分支部分。這是注冊表的系統級部分,需要提升權限才能訪問。
或者換句話說,您必須以管理員身份運行您的應用程式或使用清單檔案請求權限提升。
編輯:此外,您正在使用訪問級別打開注冊表,KEY_READ該訪問級別僅用于讀取注冊表但不寫入注冊表。
您可以在此處閱讀有關訪問級別的更多資訊
uj5u.com熱心網友回復:
首先,您不能使用RaiseLastOSError()with的無引數多載TRegistry,因為 Registry API 不會通過 Win32GetLastError()函式報告錯誤。注冊表 API 函式將錯誤代碼直接回傳給呼叫者。 TRegistry在其屬性中捕獲這些錯誤代碼LastError,然后您可以將其傳遞給 的其他多載之一RaiseLastOSError(),例如:
if not Registry.OpenKey(KeyLocation, True) then
RaiseLastOSError(Registry.LastError);
話雖如此,您正在打開密鑰以進行只讀訪問,但隨后嘗試寫入密鑰。這可能WriteString()是失敗的原因。您需要KEY_WRITE改用,或者更好地使用KEY_SET_VALUE(因為包括在這種特定情況下不需要的KEY_WRITE權限),例如:WriteString()
var
Registry: TRegistry;
begin
Registry := TRegistry.Create(KEY_SET_VALUE{KEY_WRITE});
try
Registry.RootKey := HKEY_LOCAL_MACHINE;
if not Registry.OpenKey(KeyLocation, True) then
RaiseLastOSError(Registry.LastError);
Registry.WriteString('Value1', 'text123');
finally
Registry.Free;
end;
end;
話雖如此,請注意您正在嘗試寫入HKEY_LOCAL_MACHINE,默認情況下只有管理員具有寫入權限。所以是的,您必須以提升的權限運行您的代碼,或者調整注冊表權限以向非管理員用戶授予寫訪問權限,然后以該用戶身份運行您的代碼。
此外,如果您在 64 位機器上運行,您可能需要明確指定是要訪問注冊表的 32 位 ( KEY_WOW64_32KEY) 還是 64 位 ( KEY_WOW64_32KEY) 部分。請參閱訪問備用注冊表視圖。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/422345.html
標籤:
