PDA

Ver la Versión Completa : Saber si MySQL esta corriendo


DTAR
20-11-2006, 14:33:07
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:

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

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:

if not isInstalled('MySql') then
begin
// Lo que tu quieras
end;

roman
21-11-2006, 19:56:10
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
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:

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.


if not isInstalled2('mysql') then
begin
// Lo que tu quieras
end;


:p ¿Y ahora que Roman?

roman
22-11-2006, 15:59:57
¿Y ahora que Roman?

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


{
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
de mi no se esconde nadie

...

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:

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
porque te lo tomaste como un reto

¿Yo? :confused:

// Saludos