Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Saber si MySQL esta corriendo (https://www.clubdelphi.com/foros/showthread.php?t=37682)

DTAR 20-11-2006 14:33:07

Saber si MySQL esta corriendo
 
hola gente del foro antes que nada muchas gracias por responder...
va mi duda...
resulta que estoy generando el instalador de mi aplicacion que esta hehco en Delphi 5 y trabaja con mysql... el instalador copiará los archivos y registros necesarios para su funcionamiento...
lo que quiero hacer es agregar una opcion para que detecte si tiene un servidor mysql o si tengo que instalarcelo...
una de las opciones es tratar de conectarme al localhost pero necesitaria un usuario y contraseña las cuales no tengo..
alguien sabe como "saber" si mysql esta corriendo en una pc? alguna idea... gracias...

acertij022 20-11-2006 14:42:24

No si te ayuda pero MySql corre sobre el puerto TCP 3306 si intentas abrir este puerto por medio de un socket y esta corriendo MySql en la PC te tirara un error; esto no descarta que tengas otro programa que use el puerto 3306 y te confunda con que este corriendo MySQL :eek:

roman 21-11-2006 19:13:46

También hay que considerar que el usuario puede tener instalado MySql pero que el servico esté detenido.

// Saludos

seoane 21-11-2006 19:39:02

No suelo responder preguntas sobre bases de datos, pero si es cuestión de servicios la cosa es diferente.

Para saber si un servicio esta instalado:
Código Delphi [-]
uses WinSvc;

// Para comprobar si el servicio esta instalado
function isInstalled(Nombre: String): Boolean;
var
 ServiceControlManager: SC_HANDLE;
 Service: SC_HANDLE;
 ServiceStatus: SERVICE_STATUS;
begin
  Result:= FALSE;
  ServiceControlManager:= OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
  if ServiceControlManager <> 0 then
  begin
    Service:= OpenService(ServiceControlManager,PChar(Nombre),GENERIC_READ);
    if Service <> 0 then
    begin
      Result:= TRUE;
      CloseServiceHandle(Service);
    end;
    CloseServiceHandle(ServiceControlManager);
  end;
end;

Para saber si esta iniciado
Código Delphi [-]
function isRunning(Nombre: String): Boolean;
var
 ServiceControlManager: SC_HANDLE;
 Service: SC_HANDLE;
 ServiceStatus: SERVICE_STATUS;
begin
  Result:= FALSE;
  ServiceControlManager:= OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
  if ServiceControlManager <> 0 then
  begin
    Service:= OpenService(ServiceControlManager,PChar(Nombre),GENERIC_READ);
    if Service <> 0 then
    begin
      if QueryServiceStatus(Service, ServiceStatus) then
        Result:= ServiceStatus.dwCurrentState = SERVICE_RUNNING;
      CloseServiceHandle(Service);
    end;
    CloseServiceHandle(ServiceControlManager);
  end;
end;

En el caso que nos ocupa el nombre del servicio, según google :D , es MySql así que si queremos saber si esta instalado:
Código Delphi [-]
if not isInstalled('MySql') then
begin
  // Lo que tu quieras
end;

roman 21-11-2006 19:56:10

Cita:

Empezado por seoane
En el caso que nos ocupa el nombre del servicio, según google , es MySql

Nada más por molestar un poco: esto será cierto en el 99% de los casos, pero uno puede ponerle el nombre que desee al servicio.

:p

// Saludos

seoane 21-11-2006 20:00:35

Cita:

Empezado por roman
Nada más por molestar un poco: esto será cierto en el 99% de los casos, pero uno puede ponerle el nombre que desee al servicio.

:p Si se esconde entonces ya es problema suyo.

seoane 21-11-2006 20:57:42

Bueno, de mi no se esconde nadie :cool: :D

Si el nombre se puede escoger, ¿también el nombre del ejecutable?

Buscar servicio por el nombre del ejecutable:
Código Delphi [-]
uses WinSvc;

// Para comprobar si el servicio esta instalado
function isInstalled2(Nombre: String): Boolean;
var
  ServiceControlManager: SC_HANDLE;
  Status, P: PEnumServiceStatus;
  Size, Count, Resume, i: DWORD;
  Service: SC_HANDLE;
  Config: PQueryServiceConfig;
begin
  Result:= FALSE;
  ServiceControlManager:= OpenSCManager(nil, nil, SC_MANAGER_CONNECT or
    SC_MANAGER_ENUMERATE_SERVICE);
  if ServiceControlManager <> 0 then
  begin
    GetMem(Status,Sizeof(TEnumServiceStatus));
    try
      EnumServicesStatus(ServiceControlManager,SERVICE_WIN32,SERVICE_STATE_ALL,
        Status^,0,Size,Count,Resume);
      if GetLastError = ERROR_MORE_DATA then
      begin
        FreeMem(Status);
        GetMem(Status,Size);
        if EnumServicesStatus(ServiceControlManager,SERVICE_WIN32,SERVICE_STATE_ALL,
          Status^,Size,Size,Count,Resume) then
        begin
          P:= Status;
          for i:= 1 to Count do
          begin
            if Result then
              break;
            Service:= OpenService(ServiceControlManager,P.lpServiceName,
              GENERIC_READ);
            if Service <> 0 then
            begin
              GetMem(Config,Sizeof(QUERY_SERVICE_CONFIG));
              try
                QueryServiceConfig(Service,Config,0,Size);
                if GetLastError = ERROR_INSUFFICIENT_BUFFER then
                begin
                  FreeMem(Config);
                  GetMem(Config,Size);
                  if QueryServiceConfig(Service,Config,Size,Size) then
                    if AnsiSameText(
                      Copy(ExtractFileName(String(Config.lpBinaryPathName)),1,
                      Length(Nombre)), Nombre) then
                      Result:= TRUE;
                end;
              finally
                FreeMem(Config);
              end;
              CloseServiceHandle(Service);
            end;
            inc(P);
          end;
        end;
      end;
    finally
      FreeMem(Status);
    end;
    CloseServiceHandle(ServiceControlManager);
  end;
end;

No estoy seguro del nombre del ejecutable del servicio de MySql pero según google comienza por mysql, si lo tienes instalado compruebalo.

Código Delphi [-]
if not isInstalled2('mysql') then
begin
  // Lo que tu quieras
end;

:p ¿Y ahora que Roman?

roman 22-11-2006 15:59:57

Cita:

Empezado por seoane
¿Y ahora que Roman?

Se me ocurre que podríamos hacerlo vía el registro:

Código Delphi [-]
{
  Obtiene las versiones del servidor MySQL que estén instaladas en el sistema
}
procedure GetMySqlInstalledServers(Versions: TStrings);
const
  hkMySql = '\SOFTWARE\MySQL AB\';

var
  Registry: TRegistry;
  KeyNames: TStringList;
  I: Integer;

begin
  Registry := TRegistry.Create;
  KeyNames := TStringList.Create;

  try
    Registry.RootKey := HKEY_LOCAL_MACHINE;

    if Registry.KeyExists(hkMySql) then
    begin
      Registry.OpenKeyReadOnly(hkMySql);
      Registry.GetKeyNames(KeyNames);

      for I := 0 to Pred(KeyNames.Count) do
        if AnsiStartsStr('mysql server', LowerCase(KeyNames[i])) then
        begin
          Registry.CloseKey;
          Registry.OpenKeyReadOnly(hkMySql + KeyNames[i]);
          Versions.Add(Registry.ReadString('Version'));
          Registry.CloseKey;

          Registry.OpenKeyReadOnly(hkMySql);
        end;

      Registry.CloseKey;
    end;
  finally
    Registry.Free;
    KeyNames.Free;
  end;
end;

// Saludos

seoane 22-11-2006 16:07:04

Tampoco era un reto, aunque teniendo MySql para ver como funciona ..., es mas facil :D

Por cierto, también por molestar un poco, cuando desinstalas MySql ¿se borran esas entradas de registro?

:p

roman 22-11-2006 16:14:01

Cita:

Empezado por seoane
de mi no se esconde nadie

...

Cita:

Empezado por seoane
Tampoco era un reto

¿no?

:p

seoane 22-11-2006 16:32:38

Comprobado, al desinstalar MySql también se eliminan también las entradas del registro. Roman parece que tu método es el mejor :D

Y con respecto a:
Cita:

Empezado por Yo mismo
de mi no se esconde nadie

Me refería al servicio del MySql, no entiendo porque te lo tomaste como un reto. Aunque la verdad, últimamente en cada hilo que coincidimos parece que competimos :p Y eso me gusta, aunque no este a tu nivel ...

roman 22-11-2006 18:12:43

Cita:

Empezado por seoane
porque te lo tomaste como un reto

¿Yo? :confused:

// Saludos


La franja horaria es GMT +2. Ahora son las 03:24:37.

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