PDA

Ver la Versión Completa : Detener un servicio NT


FD2004
19-05-2006, 19:59:03
Hola,

Necesito detener un servicio NT desde Delphi,

Equivalente al comando

net stop "Nombre del servicio" de NT

Hay algún modo simple ( o llamar a un archivo de comandos "detener.cmd" ? )

Gracias,

Lucio

seoane
19-05-2006, 20:32:34
No se si sera lo bastante simple, pero puedes usar esta funcion para detener un servicio:


uses WinSvc;

procedure StopService(Nombre: String);
var
ServiceControlManager: SC_HANDLE;
Service: SC_HANDLE;
ServiceStatus: SERVICE_STATUS;
begin
ServiceControlManager:= OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
if ServiceControlManager <> 0 then
begin
Service:= OpenService(ServiceControlManager,PChar(Nombre),SERVICE_ALL_ACCESS);
if Service <> 0 then
begin
if QueryServiceStatus(Service, ServiceStatus) then
begin
if ServiceStatus.dwCurrentState <> SERVICE_STOPPED then
ControlService(Service, SERVICE_CONTROL_STOP, ServiceStatus);
end;
CloseServiceHandle(Service);
end;
CloseServiceHandle(ServiceControlManager);
end;
end;


Para usarla solo tienes que pasarle el nombre del servicio que quieres detener:

StopService('NombreDelServicio');

FD2004
20-05-2006, 03:07:37
Muchas gracias,

La pruebo y vuelvo para cerrar el caso.

No se si en este foro es de estilo poner [Resuelto] en la cabeza del hilo.

Buen fin de semana,

Lucio

FD2004
20-05-2006, 16:16:47
Busqué en Google y en los discos cd, encuentro menciones, pero no los archivos.

Gracias, Lucio

seoane
20-05-2006, 16:38:11
WinSvc forma parte de las units que trae delphi, por lo menos en la version en la que yo trabajo (Delphi 7), aunque supongo que en versiones anteriores tambien debe de existir.

¿Porque quieres saber su localizacion exacta? ¿No te funciona con solo añadirlo a las uses? De todas formas yo la tengo aqui:


C:\Archivos de programa\Borland\Delphi7\Source\Rtl\Win\WinSvc.pas

juanpe
15-06-2006, 12:49:54
Hola quisiera indicar que soy incapaz de hacer que me funcione, estoy intentando parar los procesos de Interbase Guardian e Interbase Server.

El problema es que en service no me devuelve valor <> 0 .
Service:= OpenService(ServiceControlManager,PChar(Nombre),SERVICE_ALL_ACCESS);

El nombre del servicio, lo estoy tomando del nombre dentro de Herramientas Administrativas, Servicios (locales), Nombre.
Decir que el windows es Xp y que el user es administrador.

Gracias por vuestra ayuda.:)

seoane
15-06-2006, 13:19:42
El "Nombre" no es el que aparece en la Herramientas administrativas/Servicios an la columna con el titulo nombre. El nombre que necesitamos lo podemos obtener pulsando con el boton derecho sobre el servicio, vamos a propiedades y ahi parace el nombre del servicio y el nombre para mostrar, que es el que se muestra en la columna antes mencionada, el que nos interesa es el primero el nombre del servicio. Si ya lo estabas haciendo asi, entonces no se donde puede estar el problema, yo llevo usando esa misma funcion mucho tiempo y nunca tuve problemas con ella.

juanpe
15-06-2006, 17:54:42
Buenas tardes, Seoane :o
Te explico, el nombre lo estaba cogiendo correctamente, pero lo que me ha engañado ha sido que la pagina no refrescaba el cambio de estado del proceso. Es decir al comienzo, esta iniciado y mediante la aplicacion lo paraba, pero no cambiaba el estado.
Hasta que cerrando la ventana y volviendola a abrir vi que estaba detenido.


Muchas gracias por responder tan pronto.
Un saludo.