Win32::Daemon   
HISTORY:

20000618
	-Added:
		-ConfigureService
		-QueryServiceConfig

20011230 rothd@roth.net
	- Fixed bug where service doesn't work properly with Windows NT 4. We were 
	  defaulting by acccepting the SERVICE_ACCEPT_PARAMCHANGE and 
	  SERVICE_ACCEPT_NETBINDCHANGE controls. However, they were introduced in 
	  Win2k so NT 4 coughed up blood with them.

20010224
	-Added:
	-RegisterCallbacks() (and callback support)

20011205
	-Added:
	-AcceptedControls()

20011205 rothd
        -Fixed bug where "invalid service state 80" is reported in the Win32 event log.
        -Added initial support for SCM request callbacks (this is not implemented fully and
         is not supported yet).
        -Added SERVICE_CONTROL_NONE constant
        -Fixed State() so it only returns states, not commands.
        -Modified QueryLastMessage(). It now allows you to reset the last message to SERVICE_CONTROL_NONE.
        -Added SERVICE_NOT_READY state
        -Cleaned up some states.
        -Added AcceptedControls() function.

20011217 rothd
        - Added support for .Net Server accept control contants:
            SERVICE_ACCEPT_HARDWAREPROFILECHANGE
            SERVICE_ACCEPT_POWEREVENT
            SERVICE_ACCEPT_SESSIONCHANGE

20011221 rothd@roth.net
        - Fixed bug where service doesn't work properly with Windows NT 4. We were 
          defaulting by acccepting the SERVICE_ACCEPT_PARAMCHANGE and 
          SERVICE_ACCEPT_NETBINDCHANGE controls. However, they were introduced in 
          Win2k so NT 4 coughed up blood with them.

20020108 rothd@roth.net
        - Fixed another bug wwhere servie wouldn't work on Win2k machines. We
          were treating Win2k (version 5.0) the same as WinXP (version 5.1) and
          adding WinXP specific controls. This rendered the service unable to
          start, pause or stop. Fix was only in the Daemon.pm file.

20020114 marc.pijnappels@nec-computers.com
        - Fixed another bug where service wouldn't work on WinXP machines. Variable 
          recognized_controls was wrongly initialized for WinXP systems. This 
          rendered the service unable to start, pause or stop. Fix was only in 
          the Daemon.pm file.

20020605 rothd@roth.net
	- Added support for reporting service errors. You can now pass in a
	  hash reference into State(). More details in the POD docs.
	- Modified: UpdateServiceStatus() function to accept a 3rd parameter (dwError). This allows the calling code to report a service error.

20020605 rothd@roth.net
        - Added support for reporting service errors. You can now pass in a
          hash reference into State(). More details in the POD docs.

20030617 rothd@roth.net
        - Added support for querying and setting service security. This includes
          DACL and SACL support. Due to complexity and failures you can not set
          owner or group. But in most cases (99%) this is not needed.
          - GetSecurity()
          - SetSecurity()
        - Finished incorporating callback routines.
        - Added a few more events.
      		

20061222 rothd@roth.net
	- Converted to XS file.
	- Fixed callback heartbeat: now properly calls back with SERVICE_RUNNING (not SERVICE_CONTROL_RUNNING)
	- StopService() will post WM_QUIT message to the ServiceMain() thread to shut down the service thread.
	- Calling into StopService() will auto change the state to STOPPING/STOPPED so you do not need to 
	  explicitly do so (calling State() or a callback returning STOPPING/STOPPED).

20070102 rothd
	- Cleaned up a bit.
	- Added WM_QUIT message to the ServiceMain function. Now the Perl StopService() will 
	  post this message to shut down the service thread.
	- Fixed bug where messages were posted to wrong thread.

20080321 rothd
	- Added support for SERVICE_CONTROL_PRESHUTDOWN.
	- Callbacks can now return a state value. This is the functional equivilent of calling 
	  Win32::Daemon::State( $NewState ) before returning:
		//	sub EventCallback
		//	{
		//	  my( $Event, $Context ) = @_;
		//		# Process the event
		//		Win32::Daemon::State( $NewState );		
		//	  return;
		//	}
		//	=================== SAME AS ====================
		//	sub EventCallback
		//	{
		//	  my( $Event, $Context ) = @_;
		//		# Process the event
		//	  return( $NewState );
		//	}
		
	- Callback timer works correctly!
	- CALLBACK_RUNNING has been depreciated and replaced with CALLBACK_TIMER. It is only called
	  when the timer (set by CallbackTimer()) has expired. Use this as a heartbeat. You only need
	  to set it once either with CallbackTimer() or passing in the timer value when calling into 
	  StartService().
	  Set the callback using "timer" as the callback name. Using "running" will also work but it
	  is mapped to "timer". If you specify both, only "timer" will be registered.
	- Created TestFramework.pm to help with testing services.
	- Pruned out unnecessary stuff from Daemon.pm file.

20091028 Olivier Mengue
        - Disabled END {} in non-main threads to fix bug RT#50020

20101014 Jan Dubois
	- minimal POD cleanup
	- avoid CPAN indexing of the packages under test/
	- QueryLastMessage() had been renamed to LastControlMessage().
	  Rename it back to preserve backwards compatibility.

20110117 Jan Dubois
	- make sure DllMain() has "C" linkage when compiled with MinGW
	  (Haiko Strotbek). [rt#64575]
	- change StartService() and GetServiceHandle() to return proper
	  64-bit value on Win64 (Haiko Strotbek). [rt#64577]