Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-11-2006
Avatar de DTAR
DTAR DTAR is offline
Miembro
 
Registrado: nov 2005
Posts: 53
Poder: 19
DTAR Va por buen camino
Question 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...
__________________
|DTAR|
Responder Con Cita
  #2  
Antiguo 20-11-2006
Avatar de acertij022
acertij022 acertij022 is offline
Miembro
 
Registrado: may 2003
Ubicación: Argentina-Bs. As.
Posts: 233
Poder: 21
acertij022 Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 21-11-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
También hay que considerar que el usuario puede tener instalado MySql pero que el servico esté detenido.

// Saludos
Responder Con Cita
  #4  
Antiguo 21-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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 , es MySql así que si queremos saber si esta instalado:
Código Delphi [-]
if not isInstalled('MySql') then
begin
  // Lo que tu quieras
end;
Responder Con Cita
  #5  
Antiguo 21-11-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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.



// Saludos
Responder Con Cita
  #6  
Antiguo 21-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
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.
Si se esconde entonces ya es problema suyo.
Responder Con Cita
  #7  
Antiguo 21-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Bueno, de mi no se esconde nadie

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;

¿Y ahora que Roman?

Última edición por seoane fecha: 21-11-2006 a las 21:03:20.
Responder Con Cita
  #8  
Antiguo 22-11-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita
  #9  
Antiguo 22-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Tampoco era un reto, aunque teniendo MySql para ver como funciona ..., es mas facil

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

Responder Con Cita
  #10  
Antiguo 22-11-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por seoane
de mi no se esconde nadie
...

Cita:
Empezado por seoane
Tampoco era un reto
¿no?

Responder Con Cita
  #11  
Antiguo 22-11-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Comprobado, al desinstalar MySql también se eliminan también las entradas del registro. Roman parece que tu método es el mejor

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 Y eso me gusta, aunque no este a tu nivel ...
Responder Con Cita
  #12  
Antiguo 22-11-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por seoane
porque te lo tomaste como un reto
¿Yo?

// Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
saber si esta php instalado coulthard Internet 4 20-04-2006 19:56:43
Saber si un puerto está en uso Sr_Sombrero Internet 2 06-04-2006 15:26:38
Saber si una unidad de Red esta conectada comba API de Windows 2 18-04-2005 19:57:02
Saber si un formulario ya está creado o no. Tecnic2 OOP 2 27-09-2004 13:27:01
Saber si esta conectado Kaesbu Internet 1 22-09-2003 14:09:45


La franja horaria es GMT +2. Ahora son las 13:51:12.


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
Copyright 1996-2007 Club Delphi