Обнаружение установленной Lazarus IDE - PullRequest
3 голосов
/ 21 марта 2011

Как правильно определить, установлена ​​ли Lazarus IDE в системе программным способом с использованием Delphi?

Например, чтобы определить, установлен ли Delphi 7, я могу проверить этот ключ HKLM\Software\Borland\Delphi\7.0.

Я ищу похожий ключ для Lazarus в реестре Windows, но ничего не нашел.

Ответы [ 3 ]

7 голосов
/ 21 марта 2011

Lazarus хранит файл с именем environmentoptions.xml по умолчанию в папке <user name>\Local Settings\Application Data\lazarus (в некоторых случаях этот файл может находиться в другой папке). Этот файл содержит всю информацию, необходимую для получения местоположения в среде Lazarus IDE, а также FPC (компилятор Free Pascal), используемый в среде IDE.

файл environmentoptions.xml выглядит следующим образом

<?xml version="1.0"?>
<CONFIG>
  <EnvironmentOptions>
    <Version Value="106"/>
    <LazarusDirectory Value="C:\lazarus\">
      <History Count="1">
        <Item1 Value="C:\lazarus\"/>
      </History>
    </LazarusDirectory>
    <CompilerFilename Value="C:\lazarus\fpc\2.2.4\bin\i386-win32\fpc.exe">
      <History Count="3">
        <Item1 Value="C:\fpc\2.2.4\bin\i386-win32\fpc.exe"/>
        <Item2 Value="C:\lazarus\fpc\2.2.4\bin\i386-win32\fpc.exe"/>
        <Item3 Value="C:\lazarus\fpc\2.4.2\bin\i386-win32\fpc.exe"/>
      </History>
    </CompilerFilename>
    <FPCSourceDirectory Value="c:\lazarus\fpc\2.2.4\source\">
      <History Count="1">
        <Item1 Value="c:\lazarus\fpc\2.2.4\source\"/>
      </History>
    </FPCSourceDirectory>
    <MakeFilename Value="C:\lazarus\fpc\2.2.4\bin\i386-win32\make.exe">
      <History Count="2">
        <Item1 Value="C:\fpc\2.2.4\bin\i386-win32\make.exe"/>
        <Item2 Value="C:\lazarus\fpc\2.2.4\bin\i386-win32\make.exe"/>
      </History>
    </MakeFilename>
    <TestBuildDirectory Value="C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\">
      <History Count="3">
        <Item1 Value="C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\"/>
        <Item2 Value="C:\temp\"/>
        <Item3 Value="C:\windows\temp\"/>
      </History>
    </TestBuildDirectory>
    <BackupProjectFiles AdditionalExtension="bak" MaxCounter="9"/>
    <BackupOtherFiles AdditionalExtension="bak" MaxCounter="9"/>
    <Debugger Class="TGDBMIDebugger" EventLogLineLimit="100"/>
    <DebuggerFilename Value="c:\lazarus\mingw\bin\gdb.exe">
      <History Count="4">
        <Item1 Value="c:\lazarus\mingw\bin\gdb.exe"/>
        <Item2 Value="/usr/bin/gdb"/>
        <Item3 Value="/usr/local/bin/gdb"/>
        <Item4 Value="/opt/fpc/gdb"/>
      </History>
    </DebuggerFilename>
    <Recent>
      <OpenFiles Max="10" Count="10">
      </OpenFiles>
      <ProjectFiles Max="5" Count="5">
      </ProjectFiles>
      <PackageFiles Max="10" Count="1">
        <Item1 Value="C:\Librerias\Indy10\Lib\indylaz.lpk"/>
      </PackageFiles>
    </Recent>
    <ExternalTools Count="0"/>
    <CharcaseFileAction Value="Ask"/>
    <CompilerMessagesFilename Value=""/>
  </EnvironmentOptions>
  <ObjectInspectorOptions ShowHints="False" InfoBoxHeight="50">
    <Version Value="3"/>
    <ComponentTree>
      <Height Value="97"/>
    </ComponentTree>
  </ObjectInspectorOptions>
</CONFIG>

поэтому для определения того, установлена ​​ли Lazarus IDE в системе Windows, необходимо выполнить следующие шаги:

  1. Определите местоположение <user name>\Local Settings\Application Data\lazarus с помощью функции SHGetSpecialFolderLocation со значением CSIDL_LOCAL_APPDATA.

  2. Разобрать файл environmentoptions.xml, чтобы найти ключ LazarusDirectory в корневом каталоге EnvironmentOptions.

  3. Теперь, располагая IDE Lazarus, вы можете проверить наличие файла lazarus.exe в этой папке.

проверьте этот пример приложения, в котором кратко изложены все шаги в этом ответе.

{$APPTYPE CONSOLE}

uses
  ShlObj,
  ComObj,
  ActiveX,
  Classes,
  Windows,
  Variants,
  SysUtils;

function GetLocalAppDataFolder : string;
const
  CSIDL_LOCAL_APPDATA        = $001C;
var
  ppMalloc   : IMalloc;
  ppidl      : PItemIdList;
begin
  ppidl := nil;
  try
    if SHGetMalloc(ppMalloc) = S_OK then
    begin
      SHGetSpecialFolderLocation(0, CSIDL_LOCAL_APPDATA, ppidl);
      SetLength(Result, MAX_PATH);
      if not SHGetPathFromIDList(ppidl, PChar(Result)) then
        RaiseLastOSError;
      SetLength(Result, lStrLen(PChar(Result)));
    end;
  finally
   if ppidl <> nil then
         ppMalloc.free(ppidl);
  end;
end;


function GetLazarusLocalFolder : string;
begin
 Result:=Format('%slazarus',[IncludeTrailingPathDelimiter(GetLocalAppDataFolder)]);
 if not DirectoryExists(Result) then
 Result:='';
end;


function FileToString(const FileName: TFileName): AnsiString;
var
   Stream : TFileStream;
begin
  Stream:=TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
      try
        SetLength(Result, Stream.Size);
        Stream.Read(Pointer(Result)^, Stream.Size);
      except
        Result:='';
      end;
  finally
     Stream.Free;
  end;
end;

function GetLazarusFolder : string;
var
   LocalFolder : TFileName;
   FileName    : TFileName;
   XmlDoc      : OleVariant;
   Node        : OleVariant;
begin
  Result:='';
  LocalFolder:=GetLazarusLocalFolder;
  if LocalFolder<>'' then
  begin
   FileName:=IncludeTrailingPathDelimiter(LocalFolder)+'environmentoptions.xml';
   if FileExists(FileName) then
   begin
     XmlDoc       := CreateOleObject('Msxml2.DOMDocument.6.0');
     try
       XmlDoc.Async := False;
       XmlDoc.LoadXML(FileToString(FileName));
       XmlDoc.SetProperty('SelectionLanguage','XPath');

        if (XmlDoc.parseError.errorCode <> 0) then
         raise Exception.CreateFmt('Error in Xml Data %s',[XmlDoc.parseError]);

       Node  :=XmlDoc.selectSingleNode('//CONFIG/EnvironmentOptions/LazarusDirectory/@Value');
       if not VarIsClear(Node) then
       Result:=Node.text;
     finally
       XmlDoc:=Unassigned;
     end;
   end;
  end;
end;


function IsLazarusInstalled : Boolean;
begin
  Result:=FileExists(IncludeTrailingPathDelimiter(GetLazarusFolder)+'lazarus.exe');
end;

begin
 try
    CoInitialize(nil);
    try
      Writeln('Lazarus config Folder  '+GetLazarusLocalFolder);
      Writeln('Lazarus Install folder '+GetLazarusFolder);
      Writeln('Is Lazarus Installed   '+BoolToStr(IsLazarusInstalled,True));
      Readln;
    finally
      CoUninitialize;
    end;
 except
    on E:Exception do
    begin
        Writeln(E.Classname, ':', E.Message);
        Readln;
    end;
  end;
end.
2 голосов
/ 21 марта 2011

Afaik Lazarus по умолчанию не устанавливает в программные файлы. Это связано с тем, что в прошлом некоторые инструменты GNU, которые использует FPC / Lazarus, не могли работать с пробелами в именах файлов (особенно это касается компилятора ресурсов).

Обратите внимание, что каталог настроек в профиле является только каталогом по умолчанию. Можно передать собственный каталог настроек (с -pcp), например, используя пакетный файл, то, что делают несколько «палочных» версий.

Кроме того, может быть несколько установок Lazarus (несколько версий, 32-разрядные и 64-разрядные, кросс-компиляторы и т. Д.), Хотя тогда только один из них может использовать каталог appdata.

Лучшее решение IMHO - сделать его настраиваемым пользователем, но проверить файлы c: \ lazarus и / или XML в каталоге appdata, чтобы найти возможные места для установки параметров.

2 голосов
/ 21 марта 2011

, если он находится в Program Files и в вашем C: \ Users \ ваше_имя \ AppData \ Local \ lazarus?Кроме того, какая версия SO у вас есть?

LE: кажется, что Lazarus не хранит свои данные в реестре http://www.lazarus.freepascal.org/index.php?topic=9342.0

...