PDA

Ver la Versión Completa : como saber si existe una instalacion previa en la pc?


erickperez6
01-06-2011, 03:17:08
Saludos,

voy a realizar una instalacion silenciosa de firebird, pero antes de hacer esto me gustaria comprobar si en el equipo ya existe una version de firebird instalada previamente, esto me ayudaria a saltar el paso de la instalacion de la base de datos si el usuario no lo desea realizar. Como puedo lograr esto?

Casimiro Notevi
01-06-2011, 10:18:26
Debes comprobar si existe la entrada siguiente en el registro de windows (en HKEY_LOCAL_MACHINE):

_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:

_IBSERVER_ = 'gds32.dll'; // 'ibserver.exe';
_FBSERVER_ = 'fbclient.dll'; // 'fbserver.exe';

Yo tengo una función que he ido ampliando con los años, no es ninguna maravilla, pero funciona :)


(* Buscar ruta al interbase / firebird
Recibe _IB5_ = interbase 5
_IB6_ = interbase 6
_FB1_ = firebird 1
'' = buscar todos
Devuelve la ruta a ibserver.exe/fbserver o '' si no lo encuentra.
*)
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';
//
// cambio lo de fbserver porque en la versión classic no es ese el ejecutable, sino fb_inet_server, o algo así
_IBSERVER_ = 'gds32.dll'; // 'ibserver.exe';
_FBSERVER_ = 'fbclient.dll'; // 'fbserver.exe';
//
_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 :)

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;

erickperez6
01-06-2011, 20:05:32
excelente, era lo que estaba buscando, solo veo que habria que agregar algunas cosillas mas cada vez que salga una version nueva... aunque esto no sucede todos los dias

Casimiro Notevi
01-06-2011, 20:30:50
excelente, era lo que estaba buscando, solo veo que habria que agregar algunas cosillas mas cada vez que salga una version nueva... aunque esto no sucede todos los dias

Claro, por eso digo que "Yo tengo una función que he ido ampliando con los años".
De todas formas, si te fijas, desde la versión fb1.5 no lo han cambiado y creo que decidieron no cambiarlo más.