Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
CCD
Enlaces
Miembros
Trucos
Trabajo
Foros
Registrarse
Buscar
Calendario
C ontrasea
Gua de estilo
Iniciar Sesin
Temas de Hoy
Herramientas
Desplegado
#1
08-03-2014
nlsgarcia
Moderador
Club Delphi,
Revisen este cdigo:
open in browser PRO version
pdfcrowd.com
pdfcrowd.com
schs: SC_Handle;
ss: TServiceStatus;
psTemp: PChar;
dwChkP: DWord;
begin
ss.dwCurrentState := 1;
schm := OpenSCManager(PChar(Machine), SERVICES_ACTIVE_DATABASE, SC_MANAGER_CONNECT);
if (schm>0) then
begin
schs := OpenService(schm, PChar(Service), SERVICE_START or
SERVICE_QUERY_STATUS);
if (schs>0) then
begin
psTemp := nil;
if (StartService(schs, 0, psTemp)) then
if (QueryServiceStatus(schs, ss)) then
while (SERVICE_RUNNING<>ss.dwCurrentState) do
begin
dwChkP := ss.dwCheckPoint;
Sleep(ss.dwWaitHint);
if (not QueryServiceStatus(schs, ss)) then
Break;
if (ss.dwCheckPoint < dwChkP) then
Break;
end;
CloseServiceHandle(schs);
end;
CloseServiceHandle(schm);
end;
Result := SERVICE_RUNNING=ss.dwCurrentState;
open in browser PRO version
pdfcrowd.com
end;
// Detiene un Servicio en Windows 7
function ServiceStop(Machine, Service: String) : Boolean;
var
schm,
schs: SC_Handle;
ss: TServiceStatus;
dwChkP: DWord;
begin
schm := OpenSCManager(PChar(Machine), nil, SC_MANAGER_CONNECT);
if (schm>0) then
begin
schs := OpenService(schm, PChar(Service), SERVICE_STOP or
SERVICE_QUERY_STATUS);
if (schs>0) then
begin
if (ControlService(schs, SERVICE_CONTROL_STOP, ss)) then
if (QueryServiceStatus(schs, ss)) then
while (SERVICE_STOPPED<>ss.dwCurrentState) do
begin
dwChkP := ss.dwCheckPoint;
Sleep(ss.dwWaitHint);
if (not QueryServiceStatus(schs, ss)) then
Break;
if (ss.dwCheckPoint < dwChkP) then
Break;
end;
CloseServiceHandle(schs);
end;
CloseServiceHandle(schm);
open in browser PRO version
pdfcrowd.com
end;
Result := SERVICE_STOPPED=ss.dwCurrentState;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Msg : String;
begin
if (ServiceStart(Machine, Service)) then
begin
Msg := 'Servicio Iniciado Satisfactoriamente';
MessageDlg(Msg,mtInformation,[mbOK],0);
end
else
begin
Msg := 'Servicio No Iniciado Satisfactoriamente';
MessageDlg(Msg,mtError,[mbOK],0);
end
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Msg : String;
begin
if (ServiceStop(Machine, Service)) then
begin
Msg := 'Servicio Finalizado Satisfactoriamente';
MessageDlg(Msg,mtInformation,[mbOK],0);
end
else
open in browser PRO version
pdfcrowd.com
begin
Msg := 'Servicio No Finalizado Satisfactoriamente';
MessageDlg(Msg,mtError,[mbOK],0);
end
end;
end.
El cdigo anterior permite iniciar o detener un Servicio en Windows por medio de las Service Functions APIs. El
cdigo fue realizado en Delphi 7 y Delphi 2010 y funciono correctamente en Windows 7 Professional x32 y x64.
Espero sea til
Nelson.
ltima edicin por nlsgarcia fecha: 08-03-2014 a las 23:03:37.
#2
09-03-2014
[ElKurgan]
Miembro Premium
#3
09-03-2014
pdfcrowd.com
Casimiro Notevi
Moderador grun
__________________
/* Saludos
*/
Bsquedas avanzadas
#4
10-03-2014
Neftali
Aporreador de teclados
Gracias.
__________________
Ne ftal - web - MyDropBoxGua de estilo, Gua alternativa, TAG's.
* Aade tu foto al Club*
(UPDA TE) TrackInfo
v.1.7b
pdfcrowd.com
#5
17-05-2014
glsaavedra
Miembro
Muchas gracias
De gran utilidad
Saludos
Guillermo
#6
17-05-2014
glsaavedra
Miembro
pdfcrowd.com
Guillermo
#7
17-05-2014
nlsgarcia
Moderador
glsaavedra,
C ita:
pdfcrowd.com
#8
17-05-2014
glsaavedra
Miembro
#9
18-05-2014
nlsgarcia
Moderador
glsaavedra,
C ita:
pdfcrowd.com
2- Cuando te refieres a mal Detener, quieres indicar que el servicio MySQL se detiene pero la funcin ServiceStop
no finaliza?, Es correcto?.
3- El servicio de MySQL es de 32 o 64 bits?.
4- Los servicios que inician y detienen correctamente son de 32 o 64 bits?.
5- Puedes probar el iniciar y detener el servicio de MySQL en un ambiente de 32 Bits?.
Espero sea til
Nelson.
#10
20-05-2014
nlsgarcia
Moderador
Club Delphi,
Revisen este cdigo:
Cdigo Delphi [-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
open in browser PRO version
pdfcrowd.com
pdfcrowd.com
WaitTime : Word;
StartTickCount, StopTickCount : Word;
begin
try
OpenScm := OpenSCManager(PChar(Machine), SERVICES_ACTIVE_DATABASE, SC_MANAGER_CONNECT);
if (OpenScm > 0) then
begin
OpenSvr := OpenService(OpenScm, PChar(Service),
SERVICE_START or
SERVICE_QUERY_STATUS);
if (OpenSvr > 0) and (QueryServiceStatus(OpenSvr, SrvSts)) then
begin
if (StartService(OpenSvr, 0, SrvArgVec)) then
begin
StartTickCount := GetTickCount;
while QueryServiceStatus(OpenSvr, SrvSts) do
begin
WaitTime := SrvSts.dwWaitHint div 10;
if (WaitTime <
WaitTime :=
else
if (WaitTime >
WaitTime :=
1000) then
1000
10000) then
10000;
Sleep(SrvSts.dwWaitHint);
StopTickCount := GetTickCount;
open in browser PRO version
pdfcrowd.com
pdfcrowd.com
const
TimeLimit : Word = 60000;
var
OpenSvrDep : SC_Handle;
pStatus, pResult : PEnumServiceStatus;
SrvSts : TServiceStatus;
cbSize, cbSizeNeeded, cbServicesReturned : LongWord;
i: integer;
WaitTime : Word;
StartTickCount, StopTickCount : Word;
begin
Result := False;
pStatus := nil;
try
EnumDependentServices(OpenSvr, SERVICE_ACTIVE, pStatus^, 0,
cbSizeNeeded, cbServicesReturned);
GetMem(pStatus,cbSizeNeeded);
ZeroMemory(pStatus, cbSizeNeeded);
if EnumDependentServices(OpenSvr, SERVICE_ACTIVE, pStatus^,
cbSizeNeeded, cbSizeNeeded, cbServicesReturned) then
begin
pResult := pStatus;
for i := 0 to cbServicesReturned - 1 do
begin
OpenSvrDep := OpenService(OpenScm, PChar(pResult^.lpServiceName),
SERVICE_STOP or
SERVICE_QUERY_STATUS or
SERVICE_ENUMERATE_DEPENDENTS);
open in browser PRO version
pdfcrowd.com
1000) then
1000
10000) then
10000;
Sleep(SrvSts.dwWaitHint);
StopTickCount := GetTickCount;
if (StopTickCount - StartTickCount) > TimeLimit then
Break;
case SrvSts.dwCurrentState of
SERVICE_STOP_PENDING : Continue;
SERVICE_STOPPED : Break;
end;
if (SrvSts.dwCheckPoint = 0) then
Break;
end;
end;
Inc(pResult)
open in browser PRO version
pdfcrowd.com
end;
Result := True;
end
except
SysErrorMessage(GetLastError);
Result := False;
end;
FreeMem(pStatus);
end;
function ServiceStop(Machine, Service: String) : Integer;
const
TimeLimit : Word = 60000;
var
OpenScm, OpenSvr : SC_Handle;
SrvSts : TServiceStatus;
WaitTime : Word;
StartTickCount, StopTickCount : Word;
begin
OpenScm := OpenSCManager(PChar(Machine), nil, SC_MANAGER_CONNECT or
SERVICE_ENUMERATE_DEPENDENTS);
if (OpenScm > 0) then
begin
OpenSvr := OpenService(OpenScm, PChar(Service),
SERVICE_STOP or
open in browser PRO version
pdfcrowd.com
SERVICE_QUERY_STATUS or
SERVICE_ENUMERATE_DEPENDENTS);
if (OpenSvr > 0) and (QueryServiceStatus(OpenSvr, SrvSts)) then
begin
StopDependentServices(OpenScm, OpenSvr);
if ControlService(OpenSvr, SERVICE_CONTROL_STOP, SrvSts) then
begin
StartTickCount := GetTickCount;
while QueryServiceStatus(OpenSvr, SrvSts) do
begin
WaitTime := SrvSts.dwWaitHint div 10;
if (WaitTime <
WaitTime :=
else
if (WaitTime >
WaitTime :=
1000) then
1000
10000) then
10000;
Sleep(SrvSts.dwWaitHint);
StopTickCount := GetTickCount;
if (StopTickCount - StartTickCount) > TimeLimit then
Break;
case SrvSts.dwCurrentState of
SERVICE_STOP_PENDING : Continue;
SERVICE_STOPPED : Break;
end;
if (SrvSts.dwCheckPoint = 0) then
Break;
open in browser PRO version
pdfcrowd.com
end;
end;
CloseServiceHandle(OpenSvr);
end;
CloseServiceHandle(OpenScm);
end;
Result := SrvSts.dwCurrentState;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Msg : String;
begin
case ServiceStart(Machine, Service) of
1 : Msg := 'SERVICE_STOPPED';
2 : Msg := 'SERVICE_START_PENDING';
3 : Msg := 'SERVICE_STOP_PENDING';
4 : Msg := 'SERVICE_RUNNING';
6 : Msg := 'SERVICE_PAUSE_PENDING';
7 : Msg := 'SERVICE_PAUSED';
else
Msg := 'Error de Apertura en SCM o Servicio';
end;
MessageDlg(Msg,mtInformation,[mbOK],0);
end;
open in browser PRO version
pdfcrowd.com
El cdigo anterior es la versin 2 del cdigo del Msg#1 que permite iniciar o detener un Servicio en Windows por
medio de las Service Functions APIs. El cdigo fue probado en Delphi 7, Delphi 2010 y Delphi XE4 (VCL 32 Bits y 64
Bits) bajo Windows 7 Professional x32 y x64, funcionando correctamente segn lo esperado con los servicios de
prueba utilizados tanto en 32 como 64 bits.
Nota:
1- La versin 2 verifica los posibles estatus pertinentes en la apertura (Funcin ServiceStart) y cierre (Funcin
ServiceStop) del servicio a procesar.
2- La versin 2 cierra los servicios activos que son dependientes del servicio a finalizar por medio de la Funcin
StopDependentServices la cual es llamada desde la Funcin ServiceStop encargada de cerrar el servicio requerido y
open in browser PRO version
pdfcrowd.com
derivados, esto debe ser tomado en cuenta al momento de cerrar un servicio, si se obvia la Funcin
StopDependentServices todos los servicios dependientes fallaran al cerrar el servicio principal.
3- La versin 2 tiene un control de TimeOut configurable para todas las funciones, en caso de producirse un Timeout
en las funciones de Apertura o Cierre de un Servicio, estas devolvern el ltimo estatus registrado del servicio al
momento del TimeOut.
Espero sea til
Nelson.
ltima edicin por nlsgarcia fecha: 20-05-2014 a las 20:10:59.
#11
21-05-2014
glsaavedra
Miembro
Hola Nelson
Paso a responder
12345del
VCL compilado en 32
exacto, detiene el servicio pero la funcin no finaliza
Probado en W7 64 con MySQL 32 y W7 32 con MySQL 32
de ambos
probado con igual resultado - para corroborar, le pas el ejecutable a un amigo que tiene todo 32 y se comporta
mismo modo.
Saludos
Guillermo
open in browser PRO version
pdfcrowd.com
C ita:
Pregunto:
1- La aplicacin en cuestin donde se implementa el cdigo del Msg #1 es VCL o FireMonkey?, Esta
compilada en 32 Bits o 64 Bits?.
2- Cuando te refieres a mal Detener, quieres indicar que el servicio MySQL se detiene pero la funcin
ServiceStop no finaliza?, Es correcto?.
3- El servicio de MySQL es de 32 o 64 bits?.
4- Los servicios que inician y detienen correctamente son de 32 o 64 bits?.
5- Puedes probar el iniciar y detener el servicio de MySQL en un ambiente de 32 Bits?.
Espero sea til
Nelson.
#12
21-05-2014
pdfcrowd.com
nlsgarcia
Moderador
glsaavedra,
C ita:
#13
21-05-2014
glsaavedra
Miembro
Nelson
pruebo con el Msg #10 y te comento
Saludos
Guillermo
open in browser PRO version
pdfcrowd.com
Guillermo
C ita:
La falla reportada es con la versin 1 del programa que esta en el Msg #1.
Pregunto : Probastes la versin 2 del programa que esta en el Msg #10?
Nelson.
#14
21-05-2014
glsaavedra
Miembro
Nelson
prob, solo tuve que cambiar los boolean por integer de las funciones start y stop, porque si no el case daba error de
compilacin.
Salvado eso, el comportamiento es el mismo, inicia bien, detiene, sigue deteniendo pero no finalizando
Saludos
Guillermo
C ita:
pdfcrowd.com
La falla reportada es con la versin 1 del programa que esta en el Msg #1.
Pregunto : Probastes la versin 2 del programa que esta en el Msg #10?
Nelson.
#15
21-05-2014
nlsgarcia
Moderador
glsaavedra,
C ita:
En las funciones ServiceStart, ServiceStop y StopDependentServices del cdigo incluido en el Msg #10 hacer el
siguiente cambio:
Cdigo Delphi [-]
open in browser PRO version
pdfcrowd.com
#16
22-05-2014
glsaavedra
Miembro
Nelson
Perfecto !!!!
Todo funciona correctamente
Nuevamente gracias
Guillermo
#17
30-05-2014
glsaavedra
Miembro
pdfcrowd.com
Te molesto por una consulta, para ampliar, el tema de la "machine" donde iniciar o detener el servicio.
Hay alguna consideracin especial ?
Hasta ahora solo he probado con \\127.0.0.1, pero quiero hacer pruebas con un MySQL en otra IP de la red
Saludos y gracias
Guillermo
Normas de Publicacin
no
no
no
no
Puedes
Puedes
Puedes
Puedes
Saltar a Foro
Trucos
Ir
Temas Similares
Tema
Autor
Foro
Respuestas
ltimo mensaje
cmfab
Varios
09-03-2014 18:21:47
Melissa_12
MS SQL Server
20-11-2012 18:27:17
jocey
Varios
19-09-2008 21:29:13
pdfcrowd.com
mcalmanovici
Varios
27-06-2008 17:13:21
jocey
Varios
19-02-2008 02:41:26
-- Espaol 3.6.7
pdfcrowd.com