FoxPress – Marzo 2000

 

Crear Servicios NT en Fox

 

         

       (23 k) Por Alberto Rodriguez

http://www.fpress.com/

 

 

NT permite que las aplicaciones se ejecuten como servicios del NT. La diferencia entre una aplicación distribuida y un servicio es entre otras que las aplicaciones distribuidas normalmente tienen que ser lanzadas por el usuario. Los servicios son lanzados por el propio sistema cuando se pone en marcha (si así está especificado)

 

Puede ser que en alguna ocasión interese crear algún servicio de NT en Fox que esté continuamente realizando alguna operación. Un caso muy común es estar detectando la recepción de cualquier información para posteriormente procesarla. El Servicio estaría continuamente mirando en un directorio buscando una determinada información (por ejemplo la llegada de un fichero) para proceder a su procesamiento.

 

Para poder ‘transformar’ un  .EXE de VFP en un servicio de NT necesitamos los ficheros INSTSRV.EXE Y SERVANY.EXE que se adjuntan entre los ficheros del mes.

 

Lo primero que haremos será crearnos un Ejecutable de Fox y para eso:

 

1.- Creo un nuevo proyecto en Fox llamado proy1

 

2.- Añado un formulario y lo reduzco notablemente de tamaño. Le cambio el color del Backcolor y se lo pongo a verde.

 

3.- Le pongo al formulario un Timer

 

4.- En el Timer del Timer escribo:

 

set defau to c:\

create table sys(3) (campo1 C(4))

close tables

 

5.- El Activate del Form escribo

 

READ EVENTS

 

6.- En la propiedad Interval del Timer escribo 1000 para indicar que queremos que el Timer se ejecute cada 1000 milisegundos.

 

7.- La propiedad del Formulario llamada AlwaysOnTop la establezco a .T.

 

8.- Establezo el formulario como de nivel superior mediante el ShowWindows a 2

 

9.- Creo un fichero plano llamado config.fpw y escribo:

 

screen = off

sysmenu = off

 

10.- A continuación compilo el EXE.

 

11.- Una vez compilado el EXE me voy a una ventana DOS y escribo:

 

<path>INSTSRV.EXE proy1.EXE <path>\SRVANY.EXE

 

          Si todo ha ido satisfactoriamente en la ventana DOS me saldrá un mensaje indicándomelo de esa manera.

 

12.- Ejecuta el REGEDIT y localiza la siguiente clave:

 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<Mi Servicio>

 

Verás que tiene una subclave llamada Security pero nada más.

 

13.- Desde el menú de edición del REGEDIT añade la siguiente clave: Parameters

 

Deberá quedar a la misma altura en el arbol de nivel que la de Security.

 

14.- Ahora añade un parámetro dentro de Parameters llamado Application (de tipo

 

 


 


alfanumerico) y ponle como valor: <path>\<nombre de la aplicación.ext>

 

Ahora ya tenemos todo pero nuestro servicio está parado. Por tanto deberemos ir a INICIO/Configuración/Panel de Control/Servicios

Y localizar nuestro servicio. Veremos que figura como automático(se iniciará cuando se inicie Windows) pero ahora mismo no está puesto en marcha. Lo iniciamos y en la pantalla de servicio le decimos que permita interactuar con el usuario.

 


 


Nada más iniciarlo veremos que nos aparece el formulario en nuestro escritorio y empezará cada segundo a crearnos una tabla en c:\ por lo que te recomiendo que lo pares rapidamente pues de lo contrario te inundará tu disco duro.

 

Todo lo que hemos hecho manualmente también se puede hacer por código. Aquí vemos la forma de lanzar un servicio por código.

 

* Código gentileza de Pepe Llopis

#DEFINE SERVICE_START 16
#DEFINE SERVICE_STOP 32
#DEFINE SERVICE_PAUSE_CONTINUE 64
#DEFINE SERVICE_INTERROGATE 128
#DEFINE SERVICE_USER_DEFINED_CONTROL 256
#DEFINE SERVICE_ALL_ACCESS 983551

DECLARE INTEGER OpenService IN ;

ADVAPI32.DLL ;

INTEGER hSCManager, ;
STRING @lpServiceName, ;
INTEGER dwDesiredAccess

 

DECLARE INTEGER StartService IN ;

ADVAPI32.DLL ;

INTEGER hService, ;
INTEGER dwNumServiceArgs, ;
INTEGER lpServiceArgVectors

 

hService = OpenService(hSCM, "mcsvc",;

 SERVICE_START + SERVICE_STOP )
StartService(hService,0 ,0 )
CloseServiceHandle(hSCM)

 

       Aunque de una forma mucho menos sofisticada puedes lanzar el servicio con NET START <nombre del servicio> ó si tienes la utilidad sc.exe que viene con el Windows NT Resource Kit también puedes usarla.

 

          En los ficheros de este mes tienes un código completo de Pepe Llopis en el que te muestra la forma de listar todos los Servicios que hay activos llamado listsrv.zip. El programa usa una clase llamada Struct que fue diseñada por Christof Lange y Mark Wilden. Esa clase junto con una documentación muy jugosa sobre cómo manipular el API de Win desde Fox la tienes en otro fichero de este mes llamado sctruct.zip

 

 

 

 

 

FoxPress – Marzo de 2000

© 1993-2000 FoxPress. All rights reserved