Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Marcelo R Moura

Iniciar Serviço do Windows

Recommended Posts

Amigos, desenvolvi uma aplicação no BDS2009 para que meu servidor DataSnap rode como serviço, segundo o artigo

http://edn.embarcadero.com/article/39277.

 

Agora estou querendo desenvolver um código para iniciar este serviço. Minha aplicação já cria o serviço e se eu for no painel de controle, consigo iniciar o serviço. Mas queria iniciar este serviço via programação.

 

Alguém pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde.

 

Estou meio enferrujado em Delphi, mas encontrei o seguinte post:

 

http://programero.blogspot.com/2008/11/iniciar-e-parar-servios-do-windows.html

 

também encontrei este código:

 

Unit ControlService;

interface

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

const
ServiceName='NOME_DO_SERVICO';

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('Tom Lee Demo Service is not installed.',mtError,[mbOk],0);
Application.Terminate;
end;

schService:=OpenService(schSCManager,ServiceName,SERVICE_ALL_ACCESS);
if (schService<=0) then
begin
MessageDlg('Tom Lee 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.

não estou com o delphi aqui e não pude testar... mas com certeza o caminho é executar as funções de sistema operacional.

Qualquer coisa vai no help do delphi, unit WinSvc.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.