Ver la Versión Completa : 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:
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
vBulletin v3.6.8, Derechos ©2000-2013, Jelsoft Enterprises Ltd.