2013-05-27 7 views
0

У меня есть следующий код, который пытается обнаружить установки Delphi с использованием JclIDEUtils. Чтобы проверить его, я настроил две виртуальные машины, как запустить Win 7, так и в обеих системах я установил Delphi XE3, но в VM n1 я также установил Jcl, в VM n2 я этого не сделал. Ну, в n1 моя маленькая прога прекрасно работает и находит Delphi XE3, в n2 это не так! Я пытался удаленно отлаживать программу в обеих виртуальных машинах, но единственное, что я понял, это то, что объект, который запускает класс TJclBorRADToolInstallations, просто остается пустым, если Jcl не установлен.Почему JclIDEUtils работает только в том случае, если установлен Jcl?

Это мой код в 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; 

ли кто-то знает что-то об этой проблеме?

Заранее благодарим за любые советы.

+0

Если вы посмотрите на исходный код, 'TJclBorRADToolInstallations.Create;' просто создает внутренний 'TObjectList' и вызывает' ReadInstallations', который просто пытается выполнить итерацию через возможные ключи реестра, чтобы увидеть, будут ли Delphi, C++ Builder или RAD Studio установлена. Нет никакого способа, которым это может потерпеть неудачу и вернуть 'nil'; он может не найти никаких установок, но он все равно вернет экземпляр объекта. 'FDelphiInstallations.Count' может быть нулевым, что остановит выполнение цикла. Вы посмотрели на реестр (используя RegEdit) на машине, которая не работает? –

+0

Также, когда вы сделали установку, вы сделали это как администратор (щелкните правой кнопкой мыши и выберите «Запуск от имени администратора» при запуске установки) в проблемной системе? Вы устанавливали для определенного пользователя или для всех пользователей машины? –

+0

Спасибо, Кен за помощь. Решение было очень простым и немного глупым: я должен запустить Delphi один раз, чтобы JclIDEUtils обнаружил эту установку, даже если я не понимаю, почему это влияет на обнаружение Delphi ... – Marco

ответ

1

Jcl не смог обнаружить установку Delphi, потому что я не запускал Delphi. Как только я запустил Delphi, JclIDEUtils обнаруживает его установку, и моя тестовая программа успешно отображает данные установки Delphi.

+0

А, это имеет смысл. :-) По завершении установки первый запуск IDE настраивает записи по умолчанию, и если вы этого не сделаете, они не будут существовать, когда JCLIDEUtils попытается получить к ним доступ. Я не думал, что вы не запустили IDE хотя бы один раз. –

+0

Это было мое намерение использовать эту установку только для проверки моей процедуры обнаружения. :) – Marco