使用下面的代码,我尝试在注册表的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;发布于 2012-07-28 21:58:54
程序需要提升的权限才能写入本地计算机密钥。如果没有它,函数将会失败,正如您所观察到的。如果你的程序被认为是一个管理工具,那么使用一个清单文件,这样操作系统就会提示许可。如果您不需要它,那么写入当前用户密钥,这样它就不会影响系统上的所有帐户。
发布于 2013-10-21 01:22:07
你只需要释放句柄的“释放”,并在寄存器中的下一项重新创建它,而不是保持它永久设置和打开和关闭他们通过OpenKey和CloseKey!它看起来像一个bug :-)
https://stackoverflow.com/questions/11699924
复制相似问题