德尔福添加到注册表失败



我正在尝试从插件向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是默认设置,因此严格来说,您无需设置它。但在我看来,明确是有帮助的。

如果失败,则可能是注册表项字符串中有错误,或者用户没有足够的权限。使用 reg1LastError 属性找出调用失败的原因。

请注意,您泄漏了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;

相关内容

  • 没有找到相关文章

最新更新