Creating a VFP application as a service:
Sometimes it’s useful to make your application run as a service. A service can run without any user logged in, can automatically start upon reboot, and can survive user logoffs. It can also run as a different user with different access rights.
Normally, Creating a service is fairly complex, but creating a VFP application as a service is fairly straightforward, thanks to a pair of tools called INSTSRV.EXE and SRVANY.EXE that come with the Windows Resource Kit. INSTSRV.EXE takes 2 parameters: the name of the new service to install, and the full path to the SRVANY.EXE file.
For example, to create a service called “VFPSrv”, I ran this on my Windows XP machine:
C:\Program Files\Windows Resource Kits\Tools>instsrv VFPSrv "d:\Program Files\Windows Resource Kits\Tools\srvany.exe"
SRVANY provides all the main work to pretend to be a service, and it will look in the registry to find what EXE file to run to implement the service. The EXE name, the starting directory, and any optional parameters are found in the registry.
Copy/paste the following to a file named VFPSRV.REG (change the paths as necessary: note the double back-slashes) and dbl-click the .REG file to add these entries to the registery.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VFPSrv\Parameters]
"AppDirectory"="d:\\fox90\\test"
"Application"="d:\\fox90\\test\\vfpsrv.exe"
"AppParameters"="myparm1 myparm2"
You can use the VFP command window to control the service:
!net start vfpsrv
!net stop vfpsrv
or the DOS command window:
net start vfpsrv
The sample service code below executes a file called “vfpsrvrtn.prg” when the timer fires. However, this code is not built into the EXE. This means you can change the service’s behavior dynamically, without having to stop/rebuild/start the service.
The code executes the timer event every 5 seconds, aligned to the 5 second real time clock (so that it occurs at exactly :00, :05, :10, … seconds past the hour).
If you run the prg below, it will run as a normal VFP PRG, but it will also build VFPSRV.EXE.
To start it as a service, use the control panel->Administrative Tools->Services or “net start vfpsrv”
Open the log file in an automatically refreshing editor, such as Visual Studio, from another machine and then log off the main machine. You can still hear the beeps and see the log file changing when no user is logged in.
(using older versions of SRVANY or on older versions of Windows, you may need to use SYS(2340) )
*Save this content to a file called VFPSRV.PRG
LPARAMETERS parm1,parm2
CLEAR
* https://msdn.microsoft.com/library/default.asp?url=/library/en-us/tools/tools/service_control_utility.asp
* https://www.microsoft.com/msj/1097/WINNT.aspx
*To get SrvAny and SrvInst: go to https://www.microsoft.com/downloads, enter Windows 2003 Resource Kit Tools in the Keywords field, and click Go.
*Then, click the Windows Server 2003 Resource Kit Tools Download button at the Windows Server 2003 Resource Kit Tools
*Web page to download rktools.exe-which contains the most recent versions of Instsrv and Srvany-and run the executable to install the tools on your system.
#define TIMERINT 5 && # of seconds for timer interval. Also syncs to TIMERINT seconds for time of day
PUBLIC oService
oService=NEWOBJECT("vfpsrv")
oService.logstr("Starting Service: got some params: "+TRANSFORM(parm1)+" "+TRANSFORM(parm2))
IF _vfp.StartMode>0 && if we’re running as an EXE
READ events && message loop
ENDIF
*Create VFPSRVRTN.PRG that just beeps
SET TEXTMERGE TO vfpsrvrtn.prg
\LPARAMETERS oTimer,oService
\oService.logstr("")
\Messagebeep(0)
SET TEXTMERGE TO
*RETURN
BUILD PROJECT vfpsrv from vfpsrv
MODIFY PROJECT vfpsrv nowait
STRTOFILE("screen=off"+CHR(13)+CHR(10),"config.fpw") && to hide the VFP runtime desktop
_vfp.ActiveProject.Files.Add("config.fpw")
_vfp.ActiveProject.Close
BUILD EXE vfpsrv FROM vfpsrv
ERASE config.fpw
DEFINE CLASS vfpsrv AS form
PROCEDURE Init
this.logstr(CURDIR())
DECLARE integer MessageBeep IN WIN32API integer
this.AddObject("mytimer","mytimer")
WITH this.mytimer
.enabled=.t.
.interval=1000 && start it in a sec
ENDWITH
PROCEDURE Destroy
?PROGRAM()
MessageBeep(32)
PROCEDURE logstr(str as String)
str=TRANSFORM(DATETIME())+" "+str+CHR(13)+CHR(10)
??str
STRTOFILE(str,"c:\vfpsrv.log",.t.)
ENDDEFINE
DEFINE CLASS mytimer AS timer
PROCEDURE timer
DO ("vfpsrvrtn" ) with this,oService
CLEAR PROGRAM
dtNow=DATETIME() && read datetime() and seconds() close to the same instant
nsec=SECONDS()
nsec=CEILING((nsec+.5)/TIMERINT)*TIMERINT && target is # of seconds since midnight + a little for calculation time
dtTarget=DTOT(DATE())+nsec
this.interval=(dtTarget-dtNow) * 1000
ENDDEFINE
45776
Comments
Anonymous
August 02, 2005
Sometimes it’s useful to run some code in response to an event like somebody locking or unlocking your...Anonymous
August 15, 2005
I am not able to understand the application of this article. Please help.
Thanks in advance.Anonymous
September 08, 2005
I need create windows service with vfp90 ... i make this sample step by step ... but i have a problem when starting service this message appear.
Error 1053: El servicio no ha respondido a la peticion o inicio del control en un tiempo adecuadoAnonymous
September 08, 2005
<p>I need create windows service with vfp90 ... i make this sample step by step
... but i have a problem when starting service this message appear.<br>
<br>
<span style="background-color: #FFFF00"><b>Error 1053: El servicio no ha
respondido a la peticion o inicio del control en un tiempo adecuado</b></span><br>
</p>Anonymous
November 26, 2005
The Windows Shell Object can be used to control Windows services from within VFP:
oShell = CREATEOBJECT("Shell.Application")
? oShell.IsServiceRunning("VfpSrv")
? oShell.ServiceStart("VfpSrv", .F.)
? oShell.ServiceStop("VfpSrv", .T.)Anonymous
March 03, 2006
I would like some ideas on how to have a vfp service respond to events in a Clipper application.
I'm trying to sync data from a Clipper App to a VFP app - and would like to trigger the VFP Service "Update" routine with some kind of call from the Clipper app.
It would run anytime I do a DbCommit() in the Clipper App.Anonymous
May 11, 2006
I have tried the code above but seems that I cannot start the service.
"Cannot start the MYSERVICE service on LocalComputer. Error 1053: The service did not respond to the start request in a timely fashion"
Should the service exe be created in any special way? like a com exe server?
Many ThanksAnonymous
December 11, 2006
Calvin/Anyone, I can't seem to get the Destroy event to fire when the service is stopped? Is this normal or do I need to be doing something diff. Any ideas? Thanks!Anonymous
September 27, 2007
It takes a lot of work to create the blog posts and code samples that I put in my blog, and I was curiousAnonymous
April 01, 2008
PingBack from http://blog.mkahlert.de/artikel/dienste-kontrollieren-per-windows-shellAnonymous
April 18, 2008
PingBack from http://blog.mkahlert.de/artikel/creating-a-vfp-application-as-a-serviceAnonymous
September 09, 2008
Calvin/Anyone, I can run the prg and it works but when I go to start my service I get a message: "...started and then stopped. Some services stop automatically if they have no work to do. For example: The performance logs and alerts service." Any advice. ThanksAnonymous
October 23, 2008
The comment has been removedAnonymous
October 31, 2008
Calvin, Thanks for putting together this example and documentary... I will be testing and implementing a VFP appl. service with the help of this blog entry.Anonymous
January 17, 2009
PingBack from http://www.hilpers-esp.com/663374-ot-ejecutable-corriendo-como-servicioAnonymous
January 20, 2009
PingBack from http://www.hilpers.com/1067308-prozessAnonymous
January 20, 2009
PingBack from http://www.hilpers-esp.com/327605-seervicios-con-vfpAnonymous
January 20, 2009
PingBack from http://www.hilpers-esp.com/315326-aplicacion-como-servicioAnonymous
March 08, 2009
Calvin, thanks for the example. This works great on XP pro for me as a service, and in application mode on 2003 server. However, in 2003 server it loads as a service but does'nt seem to run properly (ie. simple test string written out won't even work) Do you know of a security change made recently to 2003 server that would .exe as a service? Thanks. JohnAnonymous
March 18, 2009
Is it possible to handle the stop and start events of the service from within the vfp code?Anonymous
May 31, 2009
PingBack from http://outdoorceilingfansite.info/story.php?id=1021Anonymous
May 31, 2009
PingBack from http://outdoorceilingfansite.info/story.php?id=18657Anonymous
July 30, 2009
What the solution to the error: "Error 1053: The service did not respond to the start or control request in a timely fashion."?Anonymous
August 07, 2009
Hi everybody, It is a great tool. I manage to start the code on win XP and its work great but I had a problem start it on a windows Vista. I had switched off UAC and start the tool to creat a service. The result is that the service is created succesfull. When I start the service it start without broblem but the vfp exe is not started. Has anyone know something about it? Thanks in advanceAnonymous
January 20, 2010
The comment has been removedAnonymous
April 22, 2010
Hello, I have been searching an answer to my problem. Unfortunately, I haven't found one. I just developed an application to run as a service. I am having problem running this application in Windows Server 2008. When I run the application manually, that is double-clicking the exe file from windows explorer, the my application work perfectly. However, when the applcation is run as a service, it will just stopped at some point in the application and will not continue the whole process. I have already set the service properties to use my admin account as service log-on. Any thoughts will be highly appreciated. Kind Regards, MicanAnonymous
December 17, 2010
Why Don't you just let your .exe run on start up? I think that's convenient with same results. I made a cafe client software, and it goes fine controlling everything from the clients. Even monitoring screen content and program usage.Anonymous
June 27, 2011
Calvin: Gracias por compartir estos conocimientos. Me fueron de mucha utilidad.Anonymous
July 22, 2015
Thanks for advance. how can run vfp as service on Windows 2008 / windows 2012 server ?Anonymous
September 22, 2015
I have the same problem, it runs fine on Win7, but will not start on Win2008 server.