2012-07-28 63 views
4

使用下面的代碼我嘗試在註冊表的HKEY_LOCAL_MACHINE部分設置一個值,但是我得到一個錯誤'無法爲.....設置數據' 如果我使用HKEY_CURRENT_USER那裏沒問題。嘗試在註冊表中保存值時出錯

我在這裏可能會丟失什麼。

(代碼是不完整的,但我認爲這是它的重要組成部分)

type 
    TTypWinBits = (Bit32, Bit64); 

function WinBits: TTypWinBits; 
type 
    TIsWow64Process = function(Handle:THandle; var IsWow64 : BOOL) : BOOL; stdcall; 
var 
    hKernel32 : Integer; 
    IsWow64Process : TIsWow64Process; 
    IsWow64 : BOOL; 
begin 
    Result := Bit32; 
    hKernel32 := LoadLibrary('kernel32.dll'); 
    if (hKernel32 = 0) then RaiseLastOSError; 
    @IsWow64Process := GetProcAddress(hkernel32, 'IsWow64Process'); 
    if Assigned(IsWow64Process) then 
    begin 
     IsWow64 := False; 
     if (IsWow64Process(GetCurrentProcess, IsWow64)) then 
     Result := Bit64 
     else 
     RaiseLastOSError; 
    end; 
    FreeLibrary(hKernel32); 
end; 

function TFastRegistry.CreateConnection: TRegistry; 
begin 
    Result := TRegistry.Create; 
    try 
    case WinBits of 
     Bit32: Result := TRegistry.Create; 
     Bit64: Result := TRegistry.Create(KEY_WRITE OR KEY_WOW64_64KEY); 
    end; 
    except 
    on E: exception do 
     Result := nil; 
    end; 
end; 

procedure TFastRegistry.RunAdd(aDesc, aName: string); 
var 
    Reg: TRegistry; 
    sRegKey: String; 
begin 
    sRegKey := 'Software\Microsoft\Windows\CurrentVersion\Run'; 
    Reg := CreateConnection; 
    with Reg do 
    begin 
     try 
     RootKey := HKEY_LOCAL_MACHINE; 
     if not KeyExists(sRegKey) then 
      OpenKey(sRegKey, True) 
     else 
      OpenKey(sRegKey, False); 
     WriteString(aDesc, aName); 
     finally 
     CloseKey; 
     Free; 
     end; 
    end; 
end; 
+4

也許你沒有系統註冊表寫入權限和/或你的應用程序需要權限提升。 – Marcodor 2012-07-28 09:50:41

+0

檢查此問題 - [非管理員模式下的註冊表訪問](http://stackoverflow.com/questions/1681434/registry-access-in-non-admin-mode) – PresleyDias 2012-07-28 10:04:13

+0

考慮在'Autostart'文件夾中創建一個快捷方式用戶開始菜單。這不需要管理員權限,寫入HKLM就行。另外,它給了他更多的控制權。 – Chris 2012-07-28 10:42:03

回答

6

的程序需要提升的權限寫入到本地機鍵。沒有這一點,功能將失敗,正如你所觀察到的。如果你的程序應該是一個管理工具,那麼使用一個清單文件,這樣操作系統會提示許可。如果您不需要,請寫入當前用戶密鑰,以免影響系統上的全部帳戶。

+0

因此,您應該像'Reg:= TRegistry.Create(KEY_READ或KEY_WRITE);'爲您的方案使用適當的訪問標誌一樣創建註冊表。 – 2012-07-29 22:23:37

+0

這通常是很好的建議,@Jerry,但它不符合我寫的內容。如果您的進程已擁有較高的權限,請求對計算機密鑰的寫入訪問權限僅授予寫入權限。 – 2012-07-30 05:16:00

0

你只需要釋放「Free」句柄和寄存器中的下一個條目來重新創建它,而不是通過OpenKey和CloseKey保持它的永久設置並關閉它們!它看起來像一個錯誤:-)

相關問題