Click here to Skip to main content
15,881,613 members
Articles / Programming Languages / C++
Article

Writing Windows Services - Made easy

Rate me:
Please Sign up or sign in to vote.
1.83/5 (32 votes)
11 Jun 20012 min read 195.8K   3.7K   55   33
A framework for developing Windows services.

Introduction

A Windows Service program is one that gets registered to the service manager and starts as soon as the system boots and remains running as long as the system is up. These are special kind of programs that has to do some task for them to be treated as Services.

Presented here is a couple of classes that eases the process of creating a Windows Service and controlling them.

Description

The CXService class

This class is the one that actually helps in creating the service program. This class takes care of all the internals needed viz., registering a service, handling the control events, service main, setting the service status etc.,

It has a set of macros - something like MFC message map, called as service maps, that are used for handling and processing the events of the service. It also has got a pure virtual initialization function, called during the service initialization process.

The main advantage of using this class for creating a service program is that it uses MFC like message-map functionality and so its easy to use. Moreover, because of the service maps, it has only 2 virtual functions and so the overhead is also very less.

The CXServiceManager class

This is a service control class. This provides all the functionality that is needed for creating and working with a service program or services that exists. The class methods are pretty straight forward and self-explanatory.

Usage

For creating a new Windows service program

Derive a class from CXService and implement the pure virtual function - service initialization function. Then declare the service maps and implement the necessary maps for handling the events, providing handler functions for them.

In the main() - create an object for the derived class with the service name and then call the base class initialization function. After this, make a call to the base class dispatcher function. That's it. U have created a Windows service program. Add your functionality where ever needed.

Please make sure that the dispatcher function is called as early as possible or else the program will fail. If you have lots of initialization code, then handle them in a separate thread, so that dispatcher is called ASAP.

Making the service program to service and running it

After the service program is completed you can use the CXServiceManager class to create a service and start the service. This can be done in a separate program called as the service control program. Please refer the class documentation, because its simple and straight-forward.

This is the first version of the program and Unicode support is not added. Please refer the source for further documentation. Please read the ReadMe.txt in the downloads for file description.

That's it!!

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
India India
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
GeneralGood idea Pin
vc199417-Dec-02 16:27
vc199417-Dec-02 16:27 
GeneralNice article Pin
Kumar Rangarajan16-Sep-02 8:03
Kumar Rangarajan16-Sep-02 8:03 
GeneralNT Service Pin
26-Oct-01 3:09
suss26-Oct-01 3:09 
GeneralRe: NT Service Pin
Carlos Antollini26-Oct-01 3:49
Carlos Antollini26-Oct-01 3:49 
QuestionMFC Service App that includea a task icon? Pin
11-Aug-01 6:55
suss11-Aug-01 6:55 
AnswerRe: MFC Service App that includea a task icon? Pin
Sardaukar11-Jul-02 19:45
Sardaukar11-Jul-02 19:45 
GeneralRe: MFC Service App that includea a task icon? Pin
H HVISTENDAHL30-Oct-02 9:57
H HVISTENDAHL30-Oct-02 9:57 
GeneralRe: MFC Service App that includea a task icon? Pin
Sardaukar30-Oct-02 19:29
Sardaukar30-Oct-02 19:29 
There is always another way... Smile | :)

A noninteractive service does NOT need (I said does not need, not 'is impossible') to have a tray icon. A tray icon - as any other GUI component - is a (part of) a window of the current shell. The shell is active only when an user is loggen on. So that means this icon must have a parent window owned by the service.

I suppose the taskbar icon is intended to be a mechanism intended for a visual interaction between the currently logged-on user and the service, for example, right-clicking the icon will appear a menu with Start, Pause, Stop etc. In order to call Shell_NotifyIcon with NIM_ADD we have to call CreateWindow from the service and provide a message loop.

And now comes the desktop: the service is running in - usually - LocalSystem (or in another account). Fact is, HWND is part of a desktop, the desktop is part of a window station, so that means the CreateWindow will take part in the desktop of service, not in the desktop of logged user. That's why, for example, a simple call of MessageBox from a service is totally unrecommended since the message box will display not on current user's desktop, but in the service's desktop - and nobody wants to connect to the server staying in a box a click close on a hundred on message boxes... Smile | :)

There are several approaches - and for sure there can be more - for a service to interact with the current user, including a tray icon. Such examples can be almost any type of Windows applications or components, the so-called service control/manager programs and can be launched or not at shell startup, as any other such program does:

- SQL Service Manager probably is one of the best such examples of standard Windows applications that minimizes on tray at startup and can be opened normally or using a context menu;
- a shell namespace extension that adds a new branch under My Computer (this way opens another infinte possibilities) where you can see your service (or all), display informations in a list view, execute menu and context menu commands, drag & drop executables.

I hope what I've written here can be helpful... Unsure | :~

Cristian Amarie

GeneralRe: MFC Service App that includea a task icon? Pin
Member 433781-May-03 17:04
Member 433781-May-03 17:04 
GeneralLockDatabase Pin
22-Jun-01 1:27
suss22-Jun-01 1:27 
GeneralRe: LockDatabase Pin
Ganesh Ramaswamy22-Jun-01 4:37
Ganesh Ramaswamy22-Jun-01 4:37 
GeneralWindows 9x/ME support Pin
20-Jun-01 9:00
suss20-Jun-01 9:00 
GeneralRe: Windows 9x/ME support Pin
Ganesh Ramaswamy21-Jun-01 4:43
Ganesh Ramaswamy21-Jun-01 4:43 
GeneralRe: Windows 9x/ME support Pin
Sardaukar11-Jul-02 19:47
Sardaukar11-Jul-02 19:47 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.