这是正确的方法来检测lazarus IDE是否安装在系统中编程方式使用delphi?检测安装的lazarus IDE
例如检测是否安装了德尔福7我可以检查这个密钥HKLM\Software\Borland\Delphi\7.0
。
我在Windows注册表中搜索了一个类似lazarus的密钥,但是我没有找到任何东西。
在此先感谢。
这是正确的方法来检测lazarus IDE是否安装在系统中编程方式使用delphi?检测安装的lazarus IDE
例如检测是否安装了德尔福7我可以检查这个密钥HKLM\Software\Borland\Delphi\7.0
。
我在Windows注册表中搜索了一个类似lazarus的密钥,但是我没有找到任何东西。
在此先感谢。
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是
使用SHGetSpecialFolderLocation
确定<user name>\Local Settings\Application Data\lazarus
的位置功能与CSIDL_LOCAL_APPDATA
值。
解析文件environmentoptions.xml
,找到位于EnvironmentOptions
根目录下的LazarusDirectory
密钥。
现在随着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.
如果它驻留在Program Files和您的C:\ Users \ your_name \ AppData \ Local \ lazarus中? 也是,你有什么版本的SO?
LE:看来,拉撒路不保留其数据在注册表http://www.lazarus.freepascal.org/index.php?topic=9342.0
+1这很有道理,因为Lazarus也可以在没有注册表的其他平台上运行。 :) – 2011-03-21 16:22:01
CodeTyphon有拉撒路安装文件不同的位置... – avra 2011-03-22 12:11:24
AFAIK拉撒路默认不安装到Program Files文件。这是因为在过去,FPC/Lazarus使用的一些GNU工具无法处理文件名中的空格(最显着的是资源编译器)。
请注意,配置文件中的settings目录只是默认目录。可以使用例如自己的设置目录(使用-pcp)来传递它们。一个批处理文件,这是几个“棒”版本所做的。
此外,可能会有多个lazarus安装(多个版本,32位和64位,交叉编译器等),但只有一个可以使用appdata目录。
最好的解决方案恕我直言是使用户可配置的,但检查C:\拉撒路和/或XML文件中的应用程序数据目录找到可能的位置与种子的设置。
+1很好的回答! – 2011-03-21 23:09:03