[英]Delphi adding to registry failed
我正在尝试通过插件将值添加到Internet Explorer的注册表项。 我的理解是,如果OpenKey()
找不到注册表项,那么由于我使用的是true
参数,它会创建注册表项。 但是它没有被创建,并且该函数返回false。 知道我在做什么错吗?
procedure DoInitialization;
var
...
reg1: TRegistry;
begin
reg1 := tRegistry.Create(KEY_ALL_ACCESS);
try
if reg1.OpenKey('HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Low Rights\ElevationPolicy\{B93642D4-0A6D-11DF-AD36-FF4756D89593}', true) then begin
reg1.WriteString('AppPath', ClientDir);
reg1.WriteInteger('Policy', $00000003);
reg1.WriteString('AppName', 'xxxxxxxx.exe');
end else
ShowMessage('False');
finally
reg1.CloseKey;
end;
...
end;
根密钥将在RootKey
属性中设置,而不是密钥。
reg1.RootKey := HKEY_CURRENT_USER;
if reg1.OpenKey('Software\...', True) then begin
....
实际上, HKEY_CURRENT_USER
是默认设置,因此严格来说您不需要设置它。 但是,我认为明确表述是有帮助的。
如果失败,则可能是您在注册表项字符串中输入了错误,或者该用户没有足够的权限。 使用LastError
财产reg1
找出调用失败的原因。
请注意,您泄漏了reg1
。 您需要销毁finally
块中的对象。
不要使用KEY_ALL_ACCESS
,这需要管理员权限才能使用。 在这种情况下,您只是将值写入键,因此您只需要使用KEY_SET_VALUE
。 不要要求超出您实际需要的权限。
另外,您需要使用RootKey
属性指定HKEY_CURRENT_USER
,不要在密钥路径字符串中包含它。
并且,您正在泄漏TRegistry
对象。
尝试以下方法:
procedure DoInitialization;
var
...
reg1: TRegistry;
begin
reg1 := TRegistry.Create(KEY_SET_VALUE);
try
reg1.RootKey := HKEY_CURRENT_USER;
if reg1.OpenKey('\SOFTWARE\Microsoft\Internet Explorer\Low Rights\ElevationPolicy\{B93642D4-0A6D-11DF-AD36-FF4756D89593}', true) then
begin
try
reg1.WriteString('AppPath', ClientDir);
reg1.WriteInteger('Policy', $00000003);
reg1.WriteString('AppName', 'xxxxxxxx.exe');
finally
reg1.CloseKey;
end;
end else
ShowMessage('False');
finally
reg1.Free;
end;
...
end;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.