Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   ¿Está activo FB? (https://www.clubdelphi.com/foros/showthread.php?t=91118)

Angel.Matilla 15-11-2016 17:55:00

¿Está activo FB?
 
Esta pregunta no sé si debe ir aquí o en el subforo de C++ Builder. Tengo una aplicación hecha en BCB 6 con FB 2.5 y me ha surgido una duda: ¿Hay alguna forma de saber si está instalado y ejecutándose dicho motor? Sobre todo teniendo en cuenta que puede instalarse como servicio o como programa, aunque yo recomiendo instalarlo como servicio. Ahora tengo este código:
Código PHP:

if (GetWindow(GetDesktopWindowGW_HWNDNEXT) == FindWindow("FB_Server""Firebird Server")  && // Ver 1.5
    
GetWindow(GetDesktopWindowGW_HWNDNEXT) == FindWindow("IB_Server""InterBase Server"))    // Ver 1.0
     
return false;
else
     return 
true

pero he comprobado que no funciona bien o no soy capaz de "ejecutarlo" bien.

Angel.Matilla 15-11-2016 17:57:53

Dicho de otra forma: Me da la impresión que si bsucamos un servicio, con ese código no se encuentra si está ejecutándose o no.

Casimiro Notevi 15-11-2016 20:26:17

Depende de la versión, tendrás que verificar un servicio u otro:
Código:

Superserver -> fbserver
Classicserver -> fb_inet_server
Superclassic -> fb_smp_server


ecfisa 15-11-2016 21:29:57

Hola.

Fijate si te sirve esta opción,

checkFirebird.h:
Código PHP:

#ifndef checkFirebirdH
#define checkFirebirdH

bool isFirebirdRunningvoid );

#endif 

checkFirebird.cpp:
Código PHP:

#pragma hdrstop

#include "checkFirebird.h"
#include "WinSvc.hpp"

#pragma package( smart_init )

DWORD ServiceStatus( const char* &sMachine, const char* &sService )
{
  
SC_HANDLE schmschs;
  
TServiceStatus ss;
  
DWORD dwStat 0;

  
schm OpenSCManagersMachineNULLSC_MANAGER_CONNECT );

  if ( 
schm ) {
    
schs OpenServiceschmsServiceSERVICE_QUERY_STATUS );

    if ( 
schs ) {
      if ( 
QueryServiceStatus schs, &ss ) )
        
dwStat ss.dwCurrentState;
      
CloseServiceHandleschs );
    }

    
CloseServiceHandle schm );
  }
  return 
dwStat;
}

bool isFirebirdRunningvoid )
{
  return 
ServiceStatus"""FirebirdServerDefaultInstance" ) == SERVICE_RUNNING;


Ejemplos de uso:
Código PHP:

...

#include "checkFirebird.h"

...

void __fastcall TForm1::ButtonCheckClickTObject *Sender )
{
  
ShowMessage( (isFirebirdRunning() ? "Servicio de Firebird activo" "Servicio de Firebird inactivo") );
  ...
  if ( 
isFirebirdRunning() )
  ... 

Saludos :)

Angel.Matilla 16-11-2016 10:23:02

Gracias a los dos. En cuanto pueda lo probaré y os diré como ha ido.

Angel.Matilla 22-11-2016 10:05:45

ecfisa: Gracias. Funciona a la perfección.

Angel.Matilla 23-11-2016 10:17:55

Estuve haciendo pruebas que como os he dicho funcionan a la perfección. Sin embargo he pensado que tal vez sea más efectivo preguntar por el servicio Firebird Guardian
Código PHP:

bool isFirebirdRunningvoid )
{
  return 
ServiceStatus"""FirebirdGuardianDefaultInstance" ) == SERVICE_RUNNING;


ya que si se lanza este, automátciamente se arranca el servidor. No sé que os parece.

ecfisa 24-11-2016 03:32:39

Hola.

No veo buena idea preguntar solamente por Firebird Guardian, de echo se usa cuando Firebird es ejecutado como aplicación no como servicio y era esencial en Windows 9x/MS por ejemplo.
Pero con seguridad en los S.O. mas actuales la mayoría opte por no ejecutarlo, lo que no lo haría un indicador fiable de que Firebird esté activo o no.

( What is the Firebird Guardian ? )

Saludos :)

Angel.Matilla 24-11-2016 09:26:07

Gracias por la observación; la tendré en cuenta. Sin embargo yo tengo instalado FB como servicio y tengo lanzados ambos; no sé si estaré de alguna forma interfiriendo en el buen rendimiento del motor.

ecfisa 24-11-2016 21:26:37

Hola Angel.

No no creo que degrade el rendimiento, al menos no lo he escuchado.

Saludos :)

Casimiro Notevi 25-11-2016 02:07:00

Guardian se usaba en win95/98, versión superserver y ejecutándose como aplicación, no como servicio.
Después de eso no es necesario para nada realmente, aunque muchas veces se instala por la "sensación extra" de seguridad que da.
No afecta casi para nada al rendimiento porque básicamente solo está pendiente de que esté andando el server, para lanzarlo si no se está ejecutando.

Angel.Matilla 25-11-2016 09:21:50

Perfecto. Muchas gracias por las aclaraciones.

Angel.Matilla 01-12-2016 18:33:16

Voy un pasito más allá con este hilo.

Igual que me habéis enseñado a averiguar si un servicio está o no activo, ¿se podría saber si está instalado FB? He estado viendo la ayuda sobre OpenService pero no me queda muy claro si existe algún comando que averigüe ese punto.

ecfisa 01-12-2016 23:38:22

Hola.

En un parrafo de este enlace Testing your installation dice:
Cita:

If everything works as designed, the Firebird server process will be running on your server upon completion of the installation. It will start up automatically whenever you restart your server.
por lo que controlando los puntos anteriores debería bastar. (creo que algo similar ya comentaste en un mensaje anterior)

Algo que se me ocurre para verificar si existe alguna versión de Firebird instalada es revisar si el nombre existe en la lista de programas instalados, ejemplo:
Código PHP:

...
#include <registry.hpp>

bool isFirebirdInstalled()
{
  
AnsiString CKEY "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
  
TRegistry   *rg = new TRegistry;
  
TStringList *ts = new TStringList;
  
bool found false;

  
rg->RootKey HKEY_LOCAL_MACHINE;
  if( 
rg->OpenKeyReadOnlyCKEY ) )
    
rg->GetKeyNamests );
  
rg->CloseKey();

  for ( 
int i 0ts->Count && !foundi++ ) {
    
rg->RootKey HKEY_LOCAL_MACHINE;
    
rg->OpenKeyReadOnlyCKEY '\\'ts->Strings[i] );
    
AnsiString str rg->ReadString"DisplayName" );
    
found str.Pos"Firebird" ) != 0;
    
rg->CloseKey();
  }

  
delete rg;
  
delete ts;
  return 
found;
}

void __fastcall TForm1::Button1ClickTObject *Sender )
{
  if ( 
isFirebirdInstalled() )
    
ShowMessage"Instalado" );
  else
    
ShowMessage"No instalado" );


Saludos :)

Angel.Matilla 02-12-2016 09:22:52

Muchas gracias ecfisa. No se me había ocurrido lo de buscar en el registro, pero lo cierto es que le tengo mucho respeto a meterme con él.


La franja horaria es GMT +2. Ahora son las 22:33:11.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi