繁体   English   中英

Delphi添加到注册表失败

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM