Hace poco me ví en la necesidad de arrancar el Servidor de Interbase/Firebird (en mi caso Firebird) si este estuviera desconectado al arrancar mi aplicación. En este ejemplo las funciones pertenecen a un formulario de Splash que se ejecuta nada más empezar la aplicación.
Nota: debes incluir estas cabeceras:
#include <Registry.hpp>
#include <Inifiles.hpp>
El código es el siguiente:
// Devuelve un booleano indicando true si el servidor está en ejecución o false si no lo está.
bool __fastcall TFSplash::Is_IB_Server_Running()
{
bool resultado;
if (GetWindow(GetDesktopWindow,GW_HWNDNEXT)==FindWindow("IB_Server", "InterBase Server")) {
resultado=false;
} else {
resultado=true;
}
return(resultado);
}
//---------------------------------------------------------------------------
// Esta función arranca el servidor Interbase/Firebird
bool __fastcall TFSplash::Start_IB_Server()
{
TRegistry *lRegistry = new TRegistry();
STARTUPINFO lStartUpInfo;
SECURITY_ATTRIBUTES lSecurityAttr;
PROCESS_INFORMATION lProcessInfo;
AnsiString ruta_al_ibserver;
bool resultado;
try {
lRegistry->RootKey=HKEY_LOCAL_MACHINE;
if (!lRegistry->OpenKey("SOFTWARE\\Borland\\InterBase\\CurrentVersion", false)) {
ShowMessage("InterBase server no esta instalado en este sistema.");
} else {
ruta_al_ibserver=lRegistry->ReadString("ServerDirectory") + "ibserver.exe" + " -a";
}
ZeroMemory(&lStartUpInfo, sizeof(lStartUpInfo));
ZeroMemory(&lProcessInfo, sizeof(lProcessInfo));
lStartUpInfo.cb=sizeof(lStartUpInfo);
lSecurityAttr.nLength= sizeof (lSecurityAttr);
lSecurityAttr.lpSecurityDescriptor=NULL;
lSecurityAttr.bInheritHandle=true;
if (CreateProcess(0, ruta_al_ibserver.c_str(), &lSecurityAttr, NULL, false, 0, 0, 0,
&lStartUpInfo, &lProcessInfo)!= NULL) {
resultado=true;
} else {
ShowMessage("El servidor podría no estar arrancado.");
resultado=false;
}
} catch (const Exception &e) {
delete lRegistry;
}
return(resultado);
}
//-----------------------------------------------------------------
Ważne artykuły