检测已安装的lazarus IDE

时间:2011-03-21 15:17:39

标签: delphi lazarus

检测Lazarus IDE是否使用Delphi以编程方式安装在系统中的正确方法是什么?

例如,为了检测是否安装了Delphi 7,我可以检查此密钥HKLM\Software\Borland\Delphi\7.0

我在Windows注册表中为Lazarus搜索类似的密钥,但我没有找到任何内容。

3 个答案:

答案 0 :(得分:7)

Lazarus默认在environmentoptions.xml文件夹中存储名为<user name>\Local Settings\Application Data\lazarus的文件(在某些情况下,此文件可以位于其他文件夹中)。此文件包含获取Lazarus IDE位置所需的所有信息以及IDE使用的FPC(Free Pascal编译器)。

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. 使用带有SHGetSpecialFolderLocation值的CSIDL_LOCAL_APPDATA函数确定<user name>\Local Settings\Application Data\lazarus的位置。

  2. 解析文件environmentoptions.xml,找到LazarusDirectory根目录下的EnvironmentOptions密钥。

  3. 现在,通过Lazarus IDE的位置,您可以检查该文件夹中是否存在lazarus.exe文件。

  4. 检查此示例应用程序,该应用程序总结了此答案中的所有步骤。

    {$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.
    

答案 1 :(得分:2)

如果它位于Program Files和你的C:\ Users \ your_name \ AppData \ Local \ lazarus中? 另外,你有什么版本的SO?

LE:似乎Lazarus没有将其数据保存在注册表http://www.lazarus.freepascal.org/index.php?topic=9342.0

答案 2 :(得分:2)

Afaik Lazarus默认不会安装到Program文件中。这是因为在过去,FPC / Lazarus使用的一些GNU工具无法处理文件名中的空格(最值得注意的是资源编译器)。

请注意,配置文件中的设置目录只是默认目录。可以使用例如传递自己的设置目录(使用-pcp)。一个批处理文件,是几个“粘贴”版本的东西。

此外,可能有多个lazarus安装(多个版本,32位和64位,交叉编译器等),但只有一个可以使用appdata dirrectory。

最好的解决方案是恕我直言,让用户可配置,但要检查c:\ lazarus和/或appdata dir中的XML文件,找到可能的位置来设置设置。