I've built a few services in Delphi 7 and did not have this problem. Now that I started a new service app in XE2, it won't stop properly. I don't know if it's something I'm doing wrong or if it might be a bug in the XE2 services.
The execute procedure looks like this:
procedure TMySvc.ServiceExecute(Sender: TService); begin try CoInitialize(nil); Startup; try while not Terminated do begin DoSomething; //Problem persists even when nothing's here end; finally Cleanup; CoUninitialize; end; except on e: exception do begin PostLog('EXCEPTION in Execute: '+e.Message); end; end; end; I never have an exception, as you can see I log any exception. PostLog saves to an INI file, which works fine. Now I do use ADO components, so I use CoInitialize() and CoUninitialize. It does connect to the DB and do its job properly. The problem only happens when I stop this service. Windows gives me the following message:

Then the service continues. I have to stop it a second time. The second time it does stop, but with the following message:

The log file indicates that the service did successfully free (OnDestroy event was logged) but it never successfully stopped (OnStop was never logged).
In my above code, I have two procedures Startup and Cleanup. These simply create/destroy and initialize/uninitialize my necessary things...
procedure TMySvc.Startup; begin FUpdateThread:= TMyUpdateThread.Create; FUpdateThread.OnLog:= LogUpdate; FUpdateThread.Resume; end; procedure TMySvc.Cleanup; begin FUpdateThread.Terminate; end; As you can see, I have a secondary thread running. This service actually has numerous threads running like this, and the main service thread is only logging the events from each thread. Each thread has different responsibilities. The threads are reporting properly, and they are also being terminated properly.
What could be causing this stop failure? If my posted code doesn't expose anything, then I can post more code later - just have to 'convert' it because of internal naming, etc.
EDIT
I just started NEW service project in Delphi XE2, and have the same issue. This is all my code below:
unit JDSvc; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, JDSvcMgr; type TJDService = class(TService) procedure ServiceExecute(Sender: TService); private FAfterInstall: TServiceEvent; public function GetServiceController: TServiceController; override; end; var JDService: TJDService; implementation {$R *.DFM} procedure ServiceController(CtrlCode: DWord); stdcall; begin JDService.Controller(CtrlCode); end; function TJDService.GetServiceController: TServiceController; begin Result := ServiceController; end; procedure TJDService.ServiceExecute(Sender: TService); begin while not Terminated do begin end; end; end.
while not Terminated do begin .. end;in theOnExecuteevent handler. See added code above.