Incluido en FoxCli
Servicios de Windows escritos en Visual FoxPro.
¿Tienes un PC con un exe de VFP y un Timer que alguien tiene que dejar abierto para importar pedidos, mandar los correos pendientes o hacer el cierre de cada noche? FoxService lo convierte en un servicio de Windows: arranca con el equipo, sigue funcionando aunque nadie inicie sesión, se vuelve a levantar si se cae y escribe en el Registro de eventos. Tú solo escribes la lógica, en VFP.
FoxService va dentro del instalador y de la licencia de FoxCli: no se compra aparte. Sin licencia corre entero, sin límites, y el servicio dice al arrancar que está en evaluación.
Una clase en src\main.prg, y cada método público es un trabajo. La línea *!* de encima dice cuándo corre. Es el ejemplo que trae todo proyecto nuevo: un importador de pedidos que ya funciona la primera vez que lo ejecutas.
DEFINE CLASS OrdersService AS FoxServiceBase OF foxservice.prg OLEPUBLIC
*-- Every CSV that arrives in inbox\: its orders into the table.
*!* @watch inbox *.csv
PROCEDURE ImportOrders(tcPath, tcChange)
...
ENDPROC
*-- Every 30 seconds: how many orders are waiting.
*!* @every 30s
PROCEDURE CountPending
LOCAL lnPending
THIS.OpenOrders()
COUNT FOR status == "P" TO lnPending
THIS.Log("Pending orders: " + TRANSFORM(lnPending))
ENDPROC
*-- Every night: the summary of the day.
*!* @daily 23:55
PROCEDURE DailySummary
THIS.WriteSummary()
ENDPROC
ENDDEFINELa CLI foxservice hace lo mismo sin el IDE, y en el servidor basta con el exe del servicio. Sus comandos son también herramientas para un agente de IA (foxservice_new, foxservice_build, foxservice_install…) a través de FoxStack, gratis.
foxservice new --name orders --folder C:\svc
foxservice build --folder C:\svc\orders
foxservice run --folder C:\svc\orders --for 1m
orders.exe install --account "NT SERVICE\orders" --startUn servicio no tiene pantalla ni usuario: ni formularios, ni MESSAGEBOX, ni imprimir en una impresora. El código que lo intenta no se queda colgado: el trabajo falla al momento, y el log dice la línea y el motivo. Un error de VFP llega solo al log, con su número y su línea, y el servicio sigue funcionando, así que los trabajos se escriben sin TRY ... CATCH.
Para programar, Visual FoxPro 9 o VFP Advanced 10.2 de 32 bits, y FoxForge, que se instala con FoxCli. En el servidor, Windows con el runtime de .NET 10 de 32 bits: ni Visual FoxPro, porque su runtime viaja en la carpeta del servicio, ni licencia, porque la licencia es de quien compila.
La guía completa viene con FoxForge, en Ayuda > Guía de FoxService, en español, inglés y alemán. Empieza por los primeros pasos: el importador de pedidos, explicado trabajo a trabajo.
No. Escribes una clase VFP. El exe del servicio, que FoxService deja en la carpeta dist\ junto a tu DLL, se ocupa de instalarlo, arrancarlo, pararlo, de los horarios y del Registro de eventos. Desde FoxForge ni siquiera hace falta abrir una consola: Instalar, Arrancar y Parar son botones.
FoxServer contesta peticiones HTTP: alguien llama y tu código responde. FoxCore ejecuta tareas en segundo plano dentro de tu aplicación, para que su pantalla no se quede pegada mientras tanto. FoxService no necesita ninguna aplicación abierta: trabaja solo, cuando le toca, a una hora, cada cierto tiempo o cuando llega un fichero. Se pueden usar juntos, cada uno con su licencia.
La de FoxCli: FoxService va dentro de ella y de su instalador. La licencia es de quien compila; los servidores donde corre el servicio no necesitan ninguna. Sin licencia todo corre, sin límites, y el servicio dice una vez al arrancar que está en evaluación.
La que trae es la del sistema (LocalSystem): llega a cualquier carpeta del equipo, como el programa de escritorio al que sustituye. Para una carpeta de red, una cuenta propia del servicio (NT SERVICE\nombre) o un usuario de Windows o del dominio; la contraseña se pide al instalar, sin eco.
Con 1, el valor que trae, los trabajos hacen cola: si una importación tarda diez minutos, el que corre cada 30 segundos espera y sus turnos se saltan mientras tanto. Con 2 o más, un trabajo largo no retrasa a los cortos. Cada uno es un VFP aparte, con sus variables y sus tablas abiertas.
Un error de VFP llega al log con su número y su línea, el trabajo cuenta como fallido y el servicio sigue. Un trabajo que pasa de su tiempo máximo (una hora, si no dices otra cosa) recibe el aviso de que pare; si no vuelve, el servicio se reinicia solo en unos segundos. Tres veces seguidas, y ese trabajo deja de planificarse hasta que lo revises.
En una impresora, no: un servicio no tiene sesión de usuario ni impresoras. El trabajo que lo intenta falla al momento, y el log lo dice.
Sí, con el runtime de informes: ReportToPdf saca las páginas de un .frx y el servicio compone el PDF. Las páginas son imágenes a 300 ppp, así que el texto no se puede seleccionar ni buscar, y con ese runtime corre un trabajo cada vez.
Sí, con VFP Advanced 10.2 de 32 bits. Dos diferencias: no hay runtime de informes, y se queda en un trabajo cada vez.
Sí. Los comandos de la CLI foxservice son herramientas MCP a través de FoxStack, gratis. Instalar necesita una consola de administrador: si el agente no la tiene, recibe la orden exacta para que la ejecute una persona.
Si algo no encaja, escríbeme: soporte@irwinrodriguez.dev