Note that there are some explanatory texts on larger screens.

plurals
  1. POHow can I restart a Windows service application written in Delphi?
    text
    copied!<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>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload