GARANTIR DESCONTO

Fórum Exemplo de service application com o codigo fonte ? #320505

03/05/2006

0

Gostaria de saber se alguem tem algum exemplo com codigo fonte sobre a ultilizaçào de servico com windows (service application)?


Ats,
Wellington


Wfmzipi

Wfmzipi

Responder

Post mais votado

03/05/2006

Este exemplo é um programa ´espião´ que eu fiz. Nele existe um TidTCPServer que recebe alguns comandos e executa uma ação. Através de um programa Cliente com o componente TidTCPClient eu envio o comando e o servidor executa. Se quiser posso disponibilizar o código fonte de ambos os programas para download no meu servidor. Ok???

unit uService;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  IdBaseComponent, IdComponent, IdTCPServer, Forms;


type
  TServiceThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    function CapturaTela: TBitmap;
  end;

type
  TmsServices = class(TService)
    tcpServer: TIdTCPServer;
    procedure ServiceContinue(Sender: TService; var Continued: Boolean);
    procedure ServicePause(Sender: TService; var Paused: Boolean);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceStop(Sender: TService; var Stopped: Boolean);
    procedure tcpServerExecute(AThread: TIdPeerThread);
  private
    { Private declarations }
    ServiceThread: TServiceThread;
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var
  msServices: TmsServices;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  msServices.Controller(CtrlCode);
end;

function TmsServices.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TmsServices.ServiceContinue(Sender: TService;
  var Continued: Boolean);
begin
  ServiceThread.Resume;
  Continued := True;
  tcpServer.Active := True;
end;

procedure TmsServices.ServicePause(Sender: TService; var Paused: Boolean);
begin
  ShowMessage(´Serviço Pausado´);
  ServiceThread.Suspend;
  Paused := True;
  tcpServer.Active := False;
end;

procedure TmsServices.ServiceStart(Sender: TService; var Started: Boolean);
begin
  ShowMessage(´Serviço Iniciado´);
  ServiceThread := TServiceThread.Create(False);
  Started := True;
  tcpServer.Active := True;
end;

procedure TmsServices.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
  ShowMessage(´Serviço Parado´);
  ServiceThread.Terminate;
  Stopped := True;
  tcpServer.Active := False;
end;

{ TServiceThread }

function TServiceThread.CapturaTela: TBitmap;
var
  dc: hdc;
  cv: TCanvas;
begin
  result := TBitmap.Create;
  result.Width := Screen.Width;
  result.Height := Screen.Height;
  dc := GetDc(0);
  cv := TCanvas.Create;
  cv.Handle := dc;
  result.Canvas.CopyRect(Rect(0, 0, Screen.Width, screen.Height), cv, Rect(0, 0,
    Screen.Width, Screen.Height));
  cv.Free;
  ReleaseDC(0, DC);
end;

procedure TServiceThread.Execute;
var
  Stm : TStream;
  Tela : TBitmap;
  cmd : String;
  fn : String;
  R : integer;
begin
  inherited;
  while not (Terminated) do
  begin
    // coloque aki o codigo que o serviço deve executar
  end;
end;

procedure TmsServices.tcpServerExecute(AThread: TIdPeerThread);
var
  Stm : TStream;
  Tela : TBitmap;
  cmd : String;
  fn : String;
  R : Integer;
  I : Integer;
  Words : Integer;
  Janela : String;
begin
    Randomize;
    R := Random(Maxint);
    Fn := Format(´tela¬d.bmp´, [r]);
    Cmd := AThread.Connection.ReadLn;

    if Pos(´TELA´, cmd) > 0 then
    begin
      Tela := ServiceThread.CapturaTela;
      Tela.SaveToFile(fn);
      Tela.Free;
      Stm := TFileStream.Create(fn, fmOpenRead + fmShareDenyNone);
      Athread.Connection.OpenWriteBuffer;
      Athread.Connection.WriteStream(Stm);
      Athread.Connection.CloseWriteBuffer;
      FreeAndNil(Stm);
    end;

    if Pos(´FECHAR´, Cmd) > 0 then
    begin
      Words := 0;
      for I := Length(Cmd) downto 1 do
      begin
        if Cmd[I] = ´[´ then
        begin
          Janela := Copy(Cmd, Pos(´[´, Cmd) + 1 , Words - 1);
          Break;
        end
        else
          Inc(Words);
      end;
      PostMessage(FindWindow(Nil, PChar(Janela)), WM_QUIT, 0, 0);
    end;
    Athread.Connection.Disconnect;
end;

end.

(*
-------------------------------------------------------------------------------------

Se o seu serviço tiver que obter alguma ação do usuário ou exibir
alguma msg na tela a propriedade Interactive deve ser setada para True;

Para instalar o serviço vc deve digitar project1.exe /install
Para deinstalar o serviço vc deve digitar project1.exe /uninstall

Para rodar o serviço: net start "nome do seu serviço"
Para parar o serviço: net stop "nome do seu serviço"

O serviço tb pode ser iniciado e parado no "gerenciador do computador"

O nome do serviço é definido no propriedade DisplayName

Espero que tenha ajudado.

*)





Adriano Santos

Adriano Santos
Responder

Gostei + 1

Mais Posts

03/05/2006

Ariovaldo

Existe um exemplo com fontes dentro da seção Dicas do Clube Delphi


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar