Debes comprobar si existe la entrada siguiente en el registro de windows (en HKEY_LOCAL_MACHINE):
Código Delphi
[-] _INTERBASE_5_ = '\SOFTWARE\Interbase Corp\InterBase\CurrentVersion';
_INTERBASE_6_ = '\SOFTWARE\Borland\InterBase\CurrentVersion';
_FIREBIRD_1_ = '\SOFTWARE\FirebirdSQL\Firebird\CurrentVersion';
_FIREBIRD_1_5_ = '\SOFTWARE\Firebird Project\Firebird Server\Instances';
_FIREBIRD_2_0_ = '\SOFTWARE\Firebird Project\Firebird Server\Instances';
_FIREBIRD_2_1_ = '\SOFTWARE\Firebird Project\Firebird Server\Instances';
_FIREBIRD_2_5_ = '\SOFTWARE\Firebird Project\Firebird Server\Instances';
Y después puedes mirar si existe en ese directorio uno de estos:
Código Delphi
[-] _IBSERVER_ = 'gds32.dll'; _FBSERVER_ = 'fbclient.dll';
Yo tengo una función que he ido ampliando con los años, no es ninguna maravilla, pero funciona
Código Delphi
[-]
function getRutaIBFIBlocal(cServerSql:string=''):string;
const
_INTERBASE_5_ = '\SOFTWARE\Interbase Corp\InterBase\CurrentVersion';
_INTERBASE_6_ = '\SOFTWARE\Borland\InterBase\CurrentVersion';
_FIREBIRD_1_ = '\SOFTWARE\FirebirdSQL\Firebird\CurrentVersion';
_FIREBIRD_1_5_ = '\SOFTWARE\Firebird Project\Firebird Server\Instances';
_FIREBIRD_2_0_ = '\SOFTWARE\Firebird Project\Firebird Server\Instances';
_FIREBIRD_2_1_ = '\SOFTWARE\Firebird Project\Firebird Server\Instances';
_FIREBIRD_2_5_ = '\SOFTWARE\Firebird Project\Firebird Server\Instances';
_IBSERVER_ = 'gds32.dll'; _FBSERVER_ = 'fbclient.dll'; _IB5_ = '_IB5_';
_IB6_ = '_IB6_';
_FB1_ = '_FB1_';
_FB15_ = '_FB15_';
_FB20_ = '_FB20_';
_FB21_ = '_FB21_';
_FB25_ = '_FB25_';
var
Reg : TRegistry;
iSize : Longint;
cRuta : string;
begin
Result := '';
cRuta := '';
iSize := 0;
Reg := TRegistry.Create;
Reg.RootKey := HKEY_LOCAL_MACHINE;
if cServerSql='' then
begin
Result := getRutaIBFIBlocal(_IB5_);
if Result='' then
begin
Result := getRutaIBFIBlocal(_IB6_);
if Result='' then
begin
Result := getRutaIBFIBlocal(_FB1_);
if Result='' then
begin
Result := getRutaIBFIBlocal(_FB15_);
if Result='' then
begin
Result := getRutaIBFIBlocal(_FB20_);
if Result='' then
begin
Result := getRutaIBFIBlocal(_FB21_);
if Result='' then
begin
Result := getRutaIBFIBlocal(_FB25_);
Exit;
end;
end;
end;
end;
end;
end;
end;
if cServerSql = _IB5_ then
begin
if Reg.KeyExists(_INTERBASE_5_) then
begin
Reg.OpenKey(_INTERBASE_5_,false);
cRuta := Reg.ReadString('RootDirectory') + 'bin\';
iSize := GetMideFichero(cRuta+_IBSERVER_);
if iSize > 0 then
Result := cRuta;
end
end
else
if cServerSql = _IB6_ then
begin
if Reg.KeyExists (_INTERBASE_6_) then
begin
Reg.OpenKey (_INTERBASE_6_,false);
cRuta := Reg.ReadString('RootDirectory') + 'bin\';
iSize := GetMideFichero(cRuta+_IBSERVER_);
if iSize > 0 then
Result := cRuta;
end;
end
else
if cServerSql = _FB1_ then
begin
if Reg.KeyExists (_FIREBIRD_1_) then
begin
Reg.OpenKey (_FIREBIRD_1_,false);
cRuta := Reg.ReadString('RootDirectory') + 'bin\';
iSize := GetMideFichero(cRuta+_IBSERVER_);
if iSize > 0 then
Result := cRuta;
end;
end
else
if cServerSql = _FB15_ then
begin
if Reg.KeyExists (_FIREBIRD_1_5_) then
begin
Reg.OpenKey (_FIREBIRD_1_5_,false);
cRuta := Reg.ReadString('DefaultInstance') + 'bin\';
iSize := GetMideFichero(cRuta+_FBSERVER_);
if iSize > 0 then
Result := cRuta;
end;
end
else
if cServerSql = _FB20_ then
begin
if Reg.KeyExists (_FIREBIRD_2_0_) then
begin
Reg.OpenKey (_FIREBIRD_2_0_,false);
cRuta := Reg.ReadString('DefaultInstance') + 'bin\';
iSize := GetMideFichero(cRuta+_FBSERVER_);
if iSize > 0 then
Result := cRuta;
end;
end
else
if cServerSql = _FB21_ then
begin
if Reg.KeyExists (_FIREBIRD_2_1_) then
begin
Reg.OpenKey (_FIREBIRD_2_1_,false);
cRuta := Reg.ReadString('DefaultInstance') + 'bin\';
iSize := GetMideFichero(cRuta+_FBSERVER_);
if iSize > 0 then
Result := cRuta;
end;
end
else
if cServerSql = _FB25_ then
begin
if Reg.KeyExists (_FIREBIRD_2_5_) then
begin
Reg.OpenKey (_FIREBIRD_2_5_,false);
cRuta := Reg.ReadString('DefaultInstance') + 'bin\';
iSize := GetMideFichero(cRuta+_FBSERVER_);
if iSize > 0 then
Result := cRuta;
end;
end;
Reg.Free;
end;
Y aquí está getMideFichero
Código Delphi
[-]
function GetMideFichero(const cFileName: String): Integer;
var
SearchRec : TSearchRec;
begin
if FindFirst(cFileName,faAnyFile,SearchRec)=0 then
Result := SearchRec.Size
else
Result := 0;
SysUtils.FindClose(SearchRec);
end;