2012-07-28 61 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保持它的永久设置并关闭它们!它看起来像一个错误:-)

相关问题