对TRegistry密钥的更改不要持有'

时间:2014-12-24 13:01:09

标签: delphi registry 32bit-64bit windows-7-x64 registrykey

从我的Win32应用程序中,我正在阅读和编写HKEY_CURRENT_USER\Software\Embarcadero\BDS\9.0\History Lists\hlRunParameters,这是Delphi XE2 IDE写入运行时参数的地方。

这是写代码:

procedure TFrmCleanIDEParams.BtnWriteClick(Sender: TObject);
var
  lReg      : TRegistry;
  lValue,
  lKey      : String;
  i,
  lNrToWrite,
  lNrRegVals: Integer;
begin
  .....

  lKey := Trim(EdtRegKey.Text);  // '\Software\Embarcadero\BDS\9.0\History Lists\hlRunParameters'
  if lKey = '' then Exit;
  if lKey[1] = '\' then lKey := Copy(lKey,2);

  lReg := TRegistry.Create(KEY_READ or KEY_WRITE);
  lReg.RootKey := HKEY_CURRENT_USER;
  if not lReg.OpenKey(lKey,false) then
    begin
      MessageDlg('Key not found', mtError, mbOKCancel, 0);
      Exit;
    end;
  if not lReg.ValueExists('Count') then
    begin
      MessageDlg('Value ''Count'' not found', mtError, mbOKCancel, 0);
      Exit;
    end;
  lNrRegVals := lReg.ReadInteger('Count');

  lNrToWrite := CLBParams.Items.Count;  // TCheckListBox 
  lReg.WriteInteger('Count',lNrToWrite);
  for i := 0 to lNrToWrite-1 do
  begin
    lValue := 'Item' + IntToStr(i);
    lReg.WriteString(lValue,CLBParams.Items[i]);
  end;
  // Remove the rest:
  for i := lNrToWrite to lNrRegVals-1 do
    lReg.DeleteValue('Item' + IntToStr(i));
end;

的问题:

  1. 在RegEdit中,我看到关键内容按预期更改,但Delphi IDE没有获取这些更改

  2. 有些时候(重启?)以后HKEY_CURRENT_USER键有旧值

  3. 我认为有几件事可能是原因,但我不确定要攻击哪些:

    1. 我不应该使用HKEY_CURRENT_USER,而应该使用HKEY_USERS。如果是这种情况,我该如何获得我需要使用的正确S-1-5-etc

    2. 这是一个Windows 7 64位问题,虽然我的程序和Delphi IDE都是32位。 (如何)然后我需要更改TRegistry.Create
      我阅读了这篇Delphi: Read 64-bits registry key from 32-bits process帖子,但仍然没有告诉我是否/何时使用不同的“访问密钥” 无论我的应用是32/64位,我是否总是需要使用this KEY_WOW64_64KEY value?我看到HKEY_CURRENT_USER \ Software是shared, not redirected。 (如何)我需要区别对待这些吗?

    3. BTW UAC已关闭,如果我的代码也可以与UAC一起工作,那就太好了。

1 个答案:

答案 0 :(得分:1)

  • Delphi IDE只会在启动时读取这些值。但是,必须确保在IDE完成写入后编写注册表值。
  • 您应该使用HKEY_CURRENT_USER
  • 您不应该使用备用注册表视图标志,因为该部分注册表是共享的。
  • UAC不会对此产生任何影响,因为HKEY_CURRENT_USER对于标准用户令牌是可写的。

唯一有意义的解释是另一个进程正在修改值。我的猜测是Delphi IDE就是那个过程。