Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Crear un servicio en delphi (https://www.clubdelphi.com/foros/showthread.php?t=79303)

Joviali 23-06-2012 19:38:32

Crear un servicio en delphi
 
Buenas

He modificado el codigo por esto:
Código Delphi [-]
procedure Tsv_actualiza.temporizadorTimer(Sender: TObject); 
begin  
  if Not procesoenEjecucion then     
  begin                 
    WinExec('calc',SW_SHOWNORMAL);     
  end; 
end;  

procedure Tsv_actualiza.ServiceExecute(Sender: TService); 
begin   
  temporizador.Enabled := True;  
  while not Terminated do     
    ServiceThread.ProcessRequests(True);   
  temporizador.Enabled := False;
end;

Lo unico que hago es lanzar la calculadora, pero cuando ejecuto el servicio no se lanza la calculadora sin embargo en el administrador de tares aparece en memoria el proceso.¿por que no se ejucuta con normalidad?.Si me creo un servicio y lanzo el comando:
Código Delphi [-]
WinExec('calc',SW_SHOWNORMAL);
se ejecuta con normalidad.

En definitiva lo que busco es crear un servicio donde lance una aplicacion si no esta ejecutada y lo haga repetitivamente.

Pd. no consigo resaltar sintaxis en delphi , me dice que no tengo permisos.

Casimiro Notevi 23-06-2012 19:49:34

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

heroe 24-06-2012 08:36:29

Otra opción
 
Otra opción, y por cierto más sencilla es usar un componente Timer. En el evento OnTimer puedes poner tu código que se vería algo así:
Código Delphi [-]
 If Timer1.Interval = 1000 then
 begin
 if Not procesoenEjecucion then     
  begin                 
    WinExec('calc',SW_SHOWNORMAL);     
  end;
 end;

Recuerda que el Interval esta expresado en milisegundos

Casimiro Notevi 24-06-2012 08:59:24

Cita:

Empezado por Joviali (Mensaje 435901)
Pd. no consigo resaltar sintaxis en delphi , me dice que no tengo permisos.

La primera vez que leo algo como eso :confused:, avisa si vuelve a ocurrir en otro mensaje que escribas.

Joviali 24-06-2012 20:39:52

Buenas , Heroe he probado lo que me has comentado pero como es un servicio, me dice que no hay nada para ejecutar.Te paso el codigo fuente:
unit servicio;

Joviali 24-06-2012 20:43:01

Cita:

Empezado por Joviali (Mensaje 435930)
Buenas , Heroe he probado lo que me has comentado pero como es un servicio, me dice que no hay nada para ejecutar.Te paso el codigo fuente:
unit servicio;


Código Delphi [-]
unit servicio;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  ExtCtrls,TLHelp32;

type
  Tsv_actualiza = class(TService)
    temporizador: TTimer;
    procedure temporizadorTimer(Sender: TObject);
    procedure ServiceExecute(Sender: TService);
  private
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    function procesoenEjecucion: Boolean;
    { Public declarations }
  end;

var
  sv_actualiza: Tsv_actualiza;

implementation

{$R *.DFM}

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

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

procedure Tsv_actualiza.temporizadorTimer(Sender: TObject);
begin
    if not procesoenEjecucion then
         WinExec('calc',0);
end;

procedure Tsv_actualiza.ServiceExecute(Sender: TService);
begin
  temporizador.Enabled := True;
 while not Terminated do
    ServiceThread.ProcessRequests(false);
  temporizador.Enabled := False;

end;


function Tsv_actualiza.procesoenEjecucion: Boolean;
var
  Proceso : TProcessEntry32;
  ProcessHandle : THandle;
  Sproceso   : Boolean;
  Nproceso : String;
begin
  Result := False;
  Proceso.dwSize := SizeOf(TProcessEntry32);
  ProcessHandle := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if Process32First(ProcessHandle, Proceso) then
  begin
    Nproceso:= String(Proceso.szExeFile);
    repeat Sproceso := Process32Next(ProcessHandle, Proceso);
      Nproceso:= String(Proceso.szExeFile);
      if Nproceso = 'calc.exe' then
        Result := True;
    until not Sproceso;
  end;
  CloseHandle(ProcessHandle);
end;

end.

heroe 24-06-2012 23:58:15

Aplicación Normal
 
Tal vez no te aclare bien, lo que yo decía era que te olvidaras del servicio y crearás una aplicación normal de windows y en ella usaras el componente Timer.

Joviali 28-06-2012 20:32:52

Buenas tardes, al final lo hecho con un timer desde la aplicación , gracias por tu aporte.


La franja horaria es GMT +2. Ahora son las 11:52:54.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi