The daemonapp unit implements support for daemon (service) applications in free pascal. On Windows, these applications will act as services. On Linux, they are normal command-line applications. The unit implements 3 classes: TDaemonApplication ------------------ A TCustomApplication descendent. It is the main entry point for the application. It handles the starting/stopping/installing of the service. TDaemon ------- A TDatamodule descendent. Here, the actual daemon service code should be implemented. There are several events: before/after install Executed before/after the service is being installed. Mainly useful on windows. Triggered if the binary is run with the --install option. before/after uninstall Executed before/after the service is being installed. Mainly useful on windows. Triggered if the binary is run with the --uninstall option. OnStart Executed when the service is started. This event handler should return as soon as possible. So at most it should start some event loops or start a thread which does the actual work. if it takes a long time to start, call ReportStatus at regular intervals to report the current status (important on Windows) OnStop Executed when the service is stopped. This event handler should return as soon as possible. if it takes a long time to stop, call ReportStatus at regular intervals to report the current status (important on Windows) OnPause Executed when the service should be paused. OnContinue Executed when the service should be continued. OnShutdown If stop does not work, the service will be forcedly shut down. The TDaemon class has a property Logger, which is a TEventLog descendent, which can be used to write messages to the system log. An application can contain many daemons/services. Each of them will be run in it's own thread. Only the main program will run in the main thread. TDaemonMapper ------------- This is used to define the service(s) in the system: it contains all properties with which to define the services in this binary to the system. The definitions are kept in the DaemonDefs property (a collection) Each item in the daemondefs collection defines a service: it needs a TDaemon descendent classname, a name (must be a unique name on the system) a display name. The winbindings property contains options which are specific to windows: they correspond to the options one sees in the service manager. Note that the TDaemonMapper can be used to define 2 services, but they can use 2 instances of the same TDaemon descendent class to handle the service. for example: the daemonmapper can be used to create 2 http server daemons, each which listens on a separate port. TDaemon has a property Definition, which is the definiton that was used to create the instance. Schematically one could draw it like this: TDaemonApplication +- TDaemonMapper +-TDaemonDef1 -> TDaemon instance +-TDaemonDef2 -> TDaemon instance Note that the daemon instances work independently, they are each running in their own thread. (plus an additional thread which handles the control messages from the windows service manager) There is a lazarus package available which installs support for daemons in the IDE. Michael.