2011-03-21 134 views
3

这是正确的方法来检测lazarus IDE是否安装在系统中编程方式使用delphi?检测安装的lazarus IDE

例如检测是否安装了德尔福7我可以检查这个密钥HKLM\Software\Borland\Delphi\7.0

我在Windows注册表中搜索了一个类似lazarus的密钥,但是我没有找到任何东西。

在此先感谢。

回答

7

Lazarus默认在<user name>\Local Settings\Application Data\lazarus文件夹中存储名为environmentoptions.xml的文件(在某些情况下,此文件可以位于其他文件夹中)。此文件包含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> 

这样的步骤必需品,以确定是否安装在Windows系统中的拉撒路IDE是

  1. 使用SHGetSpecialFolderLocation确定<user name>\Local Settings\Application Data\lazarus的位置功能与CSIDL_LOCAL_APPDATA值。

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

  3. 现在随着Lazarus IDE的位置,您可以检查该文件夹中是否存在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. 
+0

+1很好的回答! – 2011-03-21 23:09:03

2

如果它驻留在Program Files和您的C:\ Users \ your_name \ AppData \ Local \ lazarus中? 也是,你有什么版本的SO?

LE:看来,拉撒路不保留其数据在注册表http://www.lazarus.freepascal.org/index.php?topic=9342.0

+4

+1这很有道理,因为Lazarus也可以在没有注册表的其他平台上运行。 :) – 2011-03-21 16:22:01

+0

CodeTyphon有拉撒路安装文件不同的位置... – avra 2011-03-22 12:11:24

2

AFAIK拉撒路默认不安装到Program Files文件。这是因为在过去,FPC/Lazarus使用的一些GNU工具无法处理文件名中的空格(最显着的是资源编译器)。

请注意,配置文件中的settings目录只是默认目录。可以使用例如自己的设置目录(使用-pcp)来传递它们。一个批处理文件,这是几个“棒”版本所做的。

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

最好的解决方案恕我直言是使用户可配置的,但检查C:\拉撒路和/或XML文件中的应用程序数据目录找到可能的位置与种子的设置。