Welcome to MSDN Blogs Sign in | Join | Help

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

* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tools/tools/service_control_utility.asp

* http://www.microsoft.com/msj/1097/WINNT.aspx

 

*To get SrvAny and SrvInst: go to http://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

Published Monday, December 13, 2004 1:49 PM by Calvin_Hsia

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

# Creando una aplicaci

Saturday, February 26, 2005 5:03 PM by Esparta::doBlog()

# Reacting to Windows Session events.

Tuesday, August 02, 2005 2:45 PM by Calvin Hsia's WebLog
Sometimes it’s useful to run some code in response to an event like somebody locking or unlocking your...

# re: Creating a VFP application as a service:

Tuesday, August 16, 2005 6:15 AM by Mandeep
I am not able to understand the application of this article. Please help.

Thanks in advance.

# re: Creating a VFP application as a service:

Thursday, September 08, 2005 5:57 PM by RoadRunner
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 adecuado

# re: Creating a VFP application as a service:

Thursday, September 08, 2005 6:45 PM by RoadRunner
<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>

# re: Creating a VFP application as a service:

Saturday, November 26, 2005 4:58 PM by Sergey Berezniker
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.)

# re: Creating a VFP application as a service:

Friday, March 03, 2006 8:02 AM by amidonbill
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.  

# re: Creating a VFP application as a service:

Thursday, May 11, 2006 11:19 PM by Vali
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 Thanks

# re: Creating a VFP application as a service:

Tuesday, December 12, 2006 1:14 AM by deciacco

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!

# Analyzing Blog hit statistics

Thursday, September 27, 2007 9:04 PM by Calvin Hsia's WebLog

It takes a lot of work to create the blog posts and code samples that I put in my blog, and I was curious

# Dienste kontrollieren per Windows Shell | KnowledgeBlog

Wednesday, April 02, 2008 5:47 AM by Dienste kontrollieren per Windows Shell | KnowledgeBlog

# Creating a VFP application as a service | KnowledgeBlog

Leave a Comment

(required) 
required 
(required) 
 
Page view tracker