title: How can I restart a Windows service application written in Delphi?
body: <p>I have a Windows service written in Delphi.  One of the third-party resources it uses occasionally gets corrupted, and the only way I've found to fix the situation is to exit and restart the program.  I can detect when the resource is corrupted from within the program, and I can tell Windows to restart the service after it stops, but I can't figure out how to have the service tell itself to stop.</p>
  <p>The program is pretty simple.  I created a service application in what seems to be the normal way.  I have a subclass of TService to manage the service, while all of the functionality occurs in a separate thread.  The TService subclass pretty much just manages the execution of the subthread, and it's in the subthread that I would be detecting the corruption.</p>
  <p>For reference, here's the header info for the service and subthread.</p>
  <pre><code>type
    TScannerThread = class(TThread)
     private     
      Scanner    : TScanner;
      DefaultDir : String;
      ImageDir   : String;
      procedure CheckScanner;
     public      
      Parent     : TComponent;
      procedure Execute; override;
    end;         
    
    TCardScanSvc   = class(TService)
      procedure ServiceCreate(Sender: TObject);
      procedure ServiceExecute(Sender: TService);
      procedure ServiceStart(Sender: TService; var Started: Boolean);
      procedure ServiceStop(Sender: TService; var Stopped: Boolean);
      procedure ServicePause(Sender: TService; var Paused: Boolean);
      procedure ServiceContinue(Sender: TService; var Continued: Boolean);
     private        
      ScannerThread : TScannerThread;
     public         
      function GetServiceController: TServiceController; override;
    end;            
  
  var
    CardScanSvc : TCardScanSvc;
  </code></pre>
  <p>In a GUI application, I'd call Application.Terminate, but TServiceApplication doesn't seem to have that method.  I can terminate the subthread, but the main thread never notices, and Windows thinks the service is still running.  I can't really think of much else to try.</p>
  <p>The program was originally created in Delphi 5, and I'm currently using Delphi 2007, in case that makes a difference.</p>
  <hr />
  <h3>Edit:</h3>
  <p>With mghie's code, I can stop the service, but Windows will only restart the service if it fails unexpectedly, not if it's stopped normally.  What I'm going to do is make a separate service application, have the first signal the second if it has problems, and then have the second restart the first.</p>