Link to home
Start Free TrialLog in
Avatar of bandi081497
bandi081497

asked on

Applicatiuon running in service under WinNT

Hi Yee,

I've got a problem. I'd like to write a program wich runs
under WindowsNT, among the services.
How can I do that?

Thanks in advance

Andrew
Avatar of altena
altena

You can, but it will be hard.

I prefer to write these in C/C++, but there is
no reason why you cannot do this in Delphi.

Read all material on services from the microsoft developer
network (available online: www.microsoft.com/msdn)

I learned a lot from the "simple-service" sample (in c) that
is in the win32-SDK. You should download that one too from the
msdn site.

But take your time, as this will not be easy.
Here is a code example I picked up a while back somewhere...
I'm not sure if it works or not.  I have yet to compile it, but it might be your answer.

---------------------------------------------------------

unit DemoService;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, StdCtrls, WinSvc;

const
     ServiceName='DemoService';  

type
  TfrmMain = class(TForm)
    cmdStart: TButton;
    cmdStop: TButton;
    stsMessage: TStatusBar;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure cmdStopClick(Sender: TObject);
    procedure cmdStartClick(Sender: TObject);
  private
    { Private declarations }
    schService:SC_HANDLE;
    schSCManager:SC_HANDLE;
    ssStatus:TServiceStatus;
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.DFM}


procedure TfrmMain.FormCreate(Sender: TObject);
begin
     schSCManager:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
     if (schSCManager<=0) then
     begin
          MessageDlg('Demo Service is not installed.',mtError,[mbOk],0);
          Application.Terminate;
     end;

     schService:=OpenService(schSCManager,ServiceName,SERVICE_ALL_ACCESS);
     if (schService<=0) then
     begin
          MessageDlg('Demo Service can not open.',mtError,[mbOk],0);
          Application.Terminate;
     end;
end;

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
     CloseServiceHandle(schService);
     CloseServiceHandle(schSCManager);
end;

procedure TfrmMain.cmdStopClick(Sender: TObject);
begin
     if ControlService(schService,SERVICE_CONTROL_STOP,ssStatus) then
     begin
          stsMessage.SimpleText:='Stopping Service Now ';
          Sleep(1000);
          while (QueryServiceStatus(schService,ssStatus)) do
          begin
               Application.ProcessMessages;
               if ssStatus.dwCurrentState=SERVICE_STOP_PENDING then
               begin
                    stsMessage.SimpleText:=stsMessage.SimpleText+('.');
                    Sleep(1000);
               end
               else
                   break;
          end;

          if ssStatus.dwCurrentState=SERVICE_STOPPED then
              stsMessage.SimpleText:='Service Stop Ok'
          else
              stsMessage.SimpleText:='Service Stop Fail';
     end
     else
         stsMessage.SimpleText:='Service Stop Fail';
end;

procedure TfrmMain.cmdStartClick(Sender: TObject);
var
   Argv:PChar;
begin
     if StartService(schService,0,Argv) then
     begin
          stsMessage.SimpleText:='Start Service Now ';
          Sleep(1000);
          while (QueryServiceStatus(schService,ssStatus)) do
          begin
               Application.ProcessMessages;
               if ssStatus.dwCurrentState=SERVICE_START_PENDING then
               begin
                    stsMessage.SimpleText:=stsMessage.SimpleText+('.');
                    Sleep(1000);
               end
               else
                   break;
          end;

          if ssStatus.dwCurrentState=SERVICE_RUNNING then
              stsMessage.SimpleText:='Service Start Ok'
          else
              stsMessage.SimpleText:='Service Start Fail';
     end
     else
          stsMessage.SimpleText:='Service Start Fail';
end;

end.

ASKER CERTIFIED SOLUTION
Avatar of greendot
greendot

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial