【问题标题】:Why JclIDEUtils works only if Jcl is installed?为什么 JclIDEUtils 仅在安装了 Jcl 时才有效?
【发布时间】:2013-05-27 15:30:30
【问题描述】:

我有以下代码尝试使用 JclIDEUtils 检测 Delphi 安装。为了测试它,我设置了两个虚拟机,都运行 Win 7,在两个系统中我都安装了 Delphi XE3,但在 VM n1 中我也安装了 Jcl,在 VM n2 中我没有。 好吧,在 n1 中,我的小程序工作正常,找到了 Delphi XE3,在 n2 中却没有! 我尝试在两个 VM 中远程调试程序,但我唯一理解的一件事是,如果未安装 Jcl,实例化 TJclBorRADToolInstallations 类的对象将保持为空。

这是我在表单的 OnShow 事件中的代码:

procedure TForm1.FormShow(Sender: TObject);
var
  I, X: Integer;
  TN, SubTn: TTreeNode;
  IconIndex: Integer;
begin
  FDelphiInstallations := TJclBorRADToolInstallations.Create;
  for I := 0 to FDelphiInstallations.Count - 1 do
  begin
    IconIndex := ilDelphiIcons.AddIcon(GetSmallIcon(FDelphiInstallations[I].IdeExeFileName));
   TN := tvDisplay.Items.AddChild(nil, FDelphiInstallations[I].Name);
   TN.ImageIndex := ilDelphiIcons.Count - 1;
   TN.SelectedIndex := ilDelphiIcons.Count - 1;
   with tvDisplay.Items do
   begin
    SubTn := AddChild(TN, 'Description: ' + FDelphiInstallations[I].Description);
    SubTn.ImageIndex := 0;
    SubTn := AddChild(TN, 'Root directory: ' + FDelphiInstallations[I].RootDir);
    SubTn.ImageIndex := 0;
    SubTn := AddChild(TN, 'Projects directory: '+ FDelphiInstallations[i].DefaultProjectsDir);
    SubTn.ImageIndex := 0;
    SubTn := AddChild(TN, 'Common Projects directory: '+ FDelphiInstallations[i].CommonProjectsDir);
    SubTn.ImageIndex := 0;
    SubTn := AddChild(TN, 'Executable File name: '+ FDelphiInstallations[i].IdeExeFileName);
    SubTn.ImageIndex := 0;
    SubTn := AddChild(TN, 'Build number: '+ FDelphiInstallations[i].IdeExeBuildNumber);
    SubTn.ImageIndex := 0;
    SubTn := AddChild(TN, 'VersionNumberStr='+ FDelphiInstallations[i].VersionNumberStr);
    SubTn.ImageIndex := 0;
    SubTn := AddChild(TN, 'Registry key='+ FDelphiInstallations[i].ConfigDataLocation);
    SubTn.ImageIndex := 0;
    for X := 0 to FDelphiInstallations[i].IdePackages.Count - 1 do
    begin
      SubTn := AddChild(TN, 'Description: ' + FDelphiInstallations[I].IdePackages.PackageFileNames[X]);
      SubTn.ImageIndex := 0;
    end;
  end;
end;
end;

有人知道这个问题吗?

提前感谢您的任何建议。

【问题讨论】:

  • 如果你查看源代码,TJclBorRADToolInstallations.Create; 只是创建了一个内部TObjectList 并调用ReadInstallations,它只是尝试遍历可能的注册表项以查看 Delphi、C++Builder , 或已安装 RAD Studio。它不可能失败并返回nil;它可能找不到任何安装,但仍会返回该对象的实例。 FDelphiInstallations.Count 可以为零,这将阻止您的循环执行。您是否查看过出现故障的机器上的注册表本身(使用 RegEdit)?
  • 另外,当您进行安装时,您是否以管理员身份(开始安装时右键单击并选择Run as administrator)在问题系统上进行安装?您是为特定用户安装的,还是为机器的所有用户安装的?
  • 感谢 Ken 的帮助。解决方案非常简单而且有点愚蠢:我必须运行一次 Delphi 才能让 JclIDEUtils 检测到该安装,即使我不明白为什么这会影响 Delphi 检测...

标签: delphi jedi-code-library


【解决方案1】:

Jcl 未能检测到 Delphi 安装,因为我没有运行 Delphi。一旦我运行 Delphi,JclIDEUtils 就会检测到它的安装,并且我的测试程序会成功显示 Delphi 安装数据。

【讨论】:

  • 啊,这很有道理。 :-) 安装完成后,IDE 的第一次运行会配置默认条目,如果您不这样做,当 JCLIDEUtils 尝试访问它们时它们将不存在。我没想到你至少没有运行过一次 IDE。
  • 我打算将该安装仅用于测试我的检测程序。:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
  • 2011-11-07
  • 2019-11-23
相关资源
最近更新 更多