我正在尝试从插件向Internet Explorer的注册表项添加值。 我的理解是,如果OpenKey()
找不到注册表项,那么它会因为我使用的true
参数而创建密钥。 但它没有被创建,并且该函数返回 false。 知道我做错了什么吗?
procedure DoInitialization;
var
...
reg1: TRegistry;
begin
reg1 := tRegistry.Create(KEY_ALL_ACCESS);
try
if reg1.OpenKey('HKEY_CURRENT_USERSOFTWAREMicrosoftInternet ExplorerLow RightsElevationPolicy{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
是默认设置,因此严格来说,您无需设置它。但在我看来,明确是有帮助的。
如果失败,则可能是注册表项字符串中有错误,或者用户没有足够的权限。使用 reg1
的 LastError
属性找出调用失败的原因。
请注意,您泄漏了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('SOFTWAREMicrosoftInternet ExplorerLow RightsElevationPolicy{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;