PDA

Ver la Versión Completa : Crear un servicio en delphi


Joviali
23-06-2012, 19:38:32
Buenas

He modificado el codigo por esto:
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:
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:

http://neftali.clubdelphi.com/images/UtilizarTAGs.png

Gracias :)

heroe
24-06-2012, 08:36:29
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í:

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
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
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;


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
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.