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
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
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:=OpenSCManage r(nil,nil, SC_MANAGER _ALL_ACCES S);
if (schSCManager<=0) then
begin
MessageDlg('Demo Service is not installed.',mtError,[mbOk] ,0);
Application.Terminate;
end;
schService:=OpenService(sc hSCManager ,ServiceNa me,SERVICE _ALL_ACCES S);
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(schServ ice);
CloseServiceHandle(schSCMa nager);
end;
procedure TfrmMain.cmdStopClick(Send er: TObject);
begin
if ControlService(schService, SERVICE_CO NTROL_STOP ,ssStatus) then
begin
stsMessage.SimpleText:='St opping Service Now ';
Sleep(1000);
while (QueryServiceStatus(schSer vice,ssSta tus)) do
begin
Application.ProcessMessage s;
if ssStatus.dwCurrentState=SE RVICE_STOP _PENDING then
begin
stsMessage.SimpleText:=sts Message.Si mpleText+( '.');
Sleep(1000);
end
else
break;
end;
if ssStatus.dwCurrentState=SE RVICE_STOP PED then
stsMessage.SimpleText:='Se rvice Stop Ok'
else
stsMessage.SimpleText:='Se rvice Stop Fail';
end
else
stsMessage.SimpleText:='Se rvice Stop Fail';
end;
procedure TfrmMain.cmdStartClick(Sen der: TObject);
var
Argv:PChar;
begin
if StartService(schService,0, Argv) then
begin
stsMessage.SimpleText:='St art Service Now ';
Sleep(1000);
while (QueryServiceStatus(schSer vice,ssSta tus)) do
begin
Application.ProcessMessage s;
if ssStatus.dwCurrentState=SE RVICE_STAR T_PENDING then
begin
stsMessage.SimpleText:=sts Message.Si mpleText+( '.');
Sleep(1000);
end
else
break;
end;
if ssStatus.dwCurrentState=SE RVICE_RUNN ING then
stsMessage.SimpleText:='Se rvice Start Ok'
else
stsMessage.SimpleText:='Se rvice Start Fail';
end
else
stsMessage.SimpleText:='Se rvice Start Fail';
end;
end.
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
begin
schSCManager:=OpenSCManage
if (schSCManager<=0) then
begin
MessageDlg('Demo Service is not installed.',mtError,[mbOk]
Application.Terminate;
end;
schService:=OpenService(sc
if (schService<=0) then
begin
MessageDlg('Demo Service can not open.',mtError,[mbOk],0);
Application.Terminate;
end;
end;
procedure TfrmMain.FormClose(Sender:
begin
CloseServiceHandle(schServ
CloseServiceHandle(schSCMa
end;
procedure TfrmMain.cmdStopClick(Send
begin
if ControlService(schService,
begin
stsMessage.SimpleText:='St
Sleep(1000);
while (QueryServiceStatus(schSer
begin
Application.ProcessMessage
if ssStatus.dwCurrentState=SE
begin
stsMessage.SimpleText:=sts
Sleep(1000);
end
else
break;
end;
if ssStatus.dwCurrentState=SE
stsMessage.SimpleText:='Se
else
stsMessage.SimpleText:='Se
end
else
stsMessage.SimpleText:='Se
end;
procedure TfrmMain.cmdStartClick(Sen
var
Argv:PChar;
begin
if StartService(schService,0,
begin
stsMessage.SimpleText:='St
Sleep(1000);
while (QueryServiceStatus(schSer
begin
Application.ProcessMessage
if ssStatus.dwCurrentState=SE
begin
stsMessage.SimpleText:=sts
Sleep(1000);
end
else
break;
end;
if ssStatus.dwCurrentState=SE
stsMessage.SimpleText:='Se
else
stsMessage.SimpleText:='Se
end
else
stsMessage.SimpleText:='Se
end;
end.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
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.