Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=26)
-   -   Servicio De Windows (https://www.clubdelphi.com/foros/showthread.php?t=55624)

AXONIDS 22-04-2008 16:13:31

Servicio De Windows
 
Hola, necesito que mi aplicación arranque junto con windows
tengo claro la diferencia entre colocarla en el registro y como servicio.

Con el registro mi aplicación arranca de forma correcta cuando el usuario se logea e inicia sesión. Lo tengo de forma que se arranque para cualquier usuario.

Pero lo que necesito es que sea un servicio para que se inicie antes, para que esté activa cuando esta la pantalla de inicio de sesión y aun no se haya logeado nadie.
He creado un servicio para la aplicación, la aplicación arranca pero al poco se detiene.
Si la intento iniciar yo manualmente en la consola de servicios me da el error:
"1053 El servicio no ha respondido a la petición o inicio del control en un tiempo adecuado."
trancurrido un breve periodo de tiempo en el que la aplicación está empezando a funcionar se vuelve a detener.


Necesito ayuda para saber como solucionarlo, gracias.
He estado mirando por el foro pero no encuentro una solucción para lo mio.

Un saludo.

juanelo 22-04-2008 16:17:29

Que tal,
Porque no nos indicas que es lo que hace tu aplicacion, utiliza comunicacion tcp/ip, es una apliacion de base de datos, en fin, que es lo que hace?
Saludos

AXONIDS 22-04-2008 16:27:04

Comunicación TCP/IP con otra maquina.

La aplicación funciona correctamente, y si la pongo en el registro arranca de forma correcta junto con la sesión que se inicie en windows.
Pero como servicio no he podido hacer que arranque.
Aunque en el registro se incluye bien la entrada y la ruta es la correcta a mi aplicación, luego no arranca, (más bien intenta arrancar y se para).

Gracias

juanelo 22-04-2008 16:30:26

Cita:

Empezado por AXONIDS (Mensaje 281708)
Aunque en el registro se incluye bien la entrada y la ruta es la correcta a mi aplicación, luego no arranca, (más bien intenta arrancar y se para).

Esta parte no la entiendo.

AXONIDS 22-04-2008 16:37:32

Perdón, quería decir que se incluye entre los servicios de windows, no en el registro de windows.

BlueSteel 22-04-2008 16:37:45

Cita:

Empezado por AXONIDS (Mensaje 281708)
Comunicación TCP/IP con otra maquina.

La aplicación funciona correctamente, y si la pongo en el registro arranca de forma correcta junto con la sesión que se inicie en windows.

Hola

solo por preguntar... dices que trabaja con comunicación TCP/IP.. el Pc donde arranca el sistema tiene Dirección IP Fija o es asignada por un DHCP ???

Quizas por eso te puede dar problema... quieres correr la aplicación antes de que tome una Dirección IP

bueno, eso veeria yo antes... (puede que no sea pero...no se me ocurre otra cosa)

Salu2:p:D

AXONIDS 22-04-2008 16:51:39

La IP está asignada de forma manual.
El caso es que en el otro equipo aparece como que se conecta para iniciar la comunicación pero a los pocos segundos se desconecta.

Incluso si intento iniciar el servicio de forma manual se detiene pasados unos segundos también.

Un saludo.

juanelo 22-04-2008 16:58:10

Puedes poner el codigo de lo que haces en el start del servicio. Otra pregunta, este servicio funciona como Cliente o como servidor (que componentes usas para la comunicacion?)

AXONIDS 22-04-2008 17:25:36

La aplicación funcina correctamente si se ejecuta bajo windows de forma normal.
Funciona también bien si se pone en el registro de windows para que arranque junto con windows, pero en este caso se inicia cuando se inicia una sesión y no antes.

Falla cuando la tengo como servicio de windows tanto al arrancar el equipo como cuando intento de forma manual iniciarlo yo, obteniendo del error "1053 El servicio no ha respondido a la petición o inicio del control en un tiempo adecuado."
El caso es que la aplicación (que hace de cliente) SÍ arranca y parece que comienza a comunicarse con la otra aplicación que tengo en otro equipo que hace de aplicación servidor, pero al poco cesa y se apaga.

Que hago mal?. He intentado crear otra aplicación completamente nueva que lo unico que haga es ejecutar la otra, a ver si colaba, pero sin exito.

¿Qué puedo hacer para que el servicio se mantenga activo?

Creación del servicio:
Código Delphi [-]
procedure TMainForm.CrearServicio();
var   
  servicio: TServicio; 
begin   
  servicio := TServicio.Create('miAplicacionCliente');
  if not servicio.EstaInstalado() then servicio.Instalar(Application.Exename);
  servicio.Free;
end;

Función INICIAR:
Código Delphi [-]
function TServicio.Iniciar(): boolean;
var
  i: integer;
  argv, p: ^PChar;
  hServicio, hManejador: cardinal;
begin
  argv := nil;
  result := false;
  hManejador := self.AbrirManejador();
  if (hManejador <> 0) then
  begin
    try
      hServicio := self.AbrirServicio();
      if (hServicio <> 0) then
      begin
        if (FArgumentos.Count > 0) then begin
          GetMem(argv, FArgumentos.Count * Sizeof(PChar));
          p := argv;
          for i := 0 to FArgumentos.Count-1 do
          begin
            p^:= PChar(FArgumentos[i]);
            Inc(p);
          end;
        end;
        Result := StartService(hServicio,
         FArgumentos.Count, argv^);
        if (hServicio <> 0) then
          CloseServiceHandle(hServicio);
      end;
    finally
      if (hManejador <> 0) then
        CloseServiceHandle(hManejador);
    end;
  end;
end;

Función INSTALAR:
Código Delphi [-]
function TServicio.Instalar(ejecutable: string): boolean;
var
  hServicio, hManejador: cardinal;
begin
  FEjecutable := ejecutable;
  
  if not FileExists(FEjecutable) then
    raise EIOErrorServicio.Create(rsErrorSinEjecutable);
  if not self.ValidarNombre() then
    raise EIOErrorServicio.Create(rsErrorNombreInvalido);
  if (Length(Trim(FDescripcion)) > 256) then
    raise EIOErrorServicio.Create(rsErrorDescripcionInvalida);

  hServicio := 0;
  result := false;
  hManejador := self.AbrirManejador(SC_MANAGER_CREATE_SERVICE);
  if (hManejador <> 0) then begin
    try
      hServicio := CreateService(hManejador, Pchar(FNombre), Pchar(FDescripcion),
                    SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
                    ////SERVICE_DEMAND_START,
                    SERVICE_AUTO_START,
                    SERVICE_ERROR_NORMAL, PChar(FEjecutable), nil, nil, nil, nil, nil);
      result := (hServicio <> 0);
    finally
      if (hServicio <> 0) then
        CloseServiceHandle(hServicio);
      if (hManejador <> 0) then
        CloseServiceHandle(hManejador);
    end;
  end;
end;

juanelo 22-04-2008 17:35:56

Sobre que sistema operativo trabajas?, intenta dandole al servicio informacion de sesion, es decir, asignale un usuario que tenga derechos por ejemplo s de adminitrador, esto se hace en la pestaña "iniciar sesion" de las propiedades del servicio.
Que componentes usas para comunicarte, indy?

AXONIDS 22-04-2008 17:49:08

Uso WINDOWS XP, la cuenta en la que estoy es de administrador pero no tiene contraseña y no puedo poner lo que me has dicho de "iniciar como:"

El caso es que arrancar... arranca pero se para y me sale:
"1053 El servicio no ha respondido a la petición o inicio del control en un tiempo adecuado."

Es como si windows "matara" el proceso .... ¿no?

El motivo por el que quiero que se arranque antes de iniciar sesión es para si no se inicia ninguna sesión, la aplicación ya pueda estar marchando.

juanelo 22-04-2008 18:57:38

Cita:

Empezado por AXONIDS (Mensaje 281740)
Uso WINDOWS XP, la cuenta en la que estoy es de administrador pero no tiene contraseña y no puedo poner lo que me has dicho de "iniciar como:"

Porque no puedes?, no hayas en donde hacerlo o por motivos de seguridad?

AXONIDS 22-04-2008 21:27:31

No deja que la contraseña sea nula, y no puedo obligar a poner contraseña a los usuarios.

juanelo 23-04-2008 00:22:41

Cita:

Empezado por AXONIDS (Mensaje 281826)
No deja que la contraseña sea nula, y no puedo obligar a poner contraseña a los usuarios.

Pero hiciste la prueba?, porque no es necesario que el usuario la coloque, al momento de instalar el servicio se puede hacer con el usuario y contraseña que indiques.

AXONIDS 23-04-2008 09:10:44

Pero si el equipo no tiene ningún usuario creado con contraseña, pues no me vale, no puedo obligar a los usuarios a meter contraseñas.

De todos modos el caso es, que la comunicacion se inicia correctamente y aparentemente funciona durante unos ~30 segundos, pero luego se para.
Por que puede dejar de funcionar un servicio??

juanelo 23-04-2008 18:28:20

Cita:

Empezado por AXONIDS (Mensaje 281913)
De todos modos el caso es, que la comunicacion se inicia correctamente y aparentemente funciona durante unos ~30 segundos, pero luego se para.
Por que puede dejar de funcionar un servicio??

Entonces quieres decir que servicio arranca correctamente y funciona durante 30 segundo aprox., entonces el problema viene en tu programa, ha de tener alguna caida inesperada que hace que se cierre el exe del servicio y voilá!.

AXONIDS 23-04-2008 19:03:39

La aplicación funciona bien, si yo la ejecuto funciona a las mil maravillas hasta que yo la desee finalizar.
Incluso si la tengo en el registro arranca con una sesión en windows y tampoco tengo ningún problema.

Hay algo que diferencie una aplicación normal de una que quiera arrancar como servicio, es decir, una aplicación de servicio tiene que hacer o no hacer algo en especial.

Gracias

juanelo 23-04-2008 20:08:15

Cita:

Empezado por AXONIDS (Mensaje 282030)
La aplicación funciona bien, si yo la ejecuto funciona a las mil maravillas hasta que yo la desee finalizar.
Incluso si la tengo en el registro arranca con una sesión en windows y tampoco tengo ningún problema.

Hay algo que diferencie una aplicación normal de una que quiera arrancar como servicio, es decir, una aplicación de servicio tiene que hacer o no hacer algo en especial.

Gracias

Definitavamente un servicio no es una aplicación "normalita" de windows, de hecho tienes que ver que esta aplicacion no tiene una ventana, y por lo tanto no existe un ciclo de mensaje de ventana, asi que por ejemplo no podrías sacar mensajes (message box) como lo hacen normalmente (si se puede pero con una directicva especial como parametro), los timers "normales" es decir los que arrastras de la paleta no funcionarían, tendrías que crearte un timer que no dependa de una ventana. Una de las mas importantes y muchas veces ignorada, es la de las dependencias con otros servicios, imaginate que tu servicio hace uso de Firebird y este no ha arrancado cuando el tuyo ya lo hizo!.
Y Por supuesto el tema de seguridad es fundamental, recuerda que windows tiene una cuenta especial que le asigna al servicio cuando este no tiene explicitamente una cuenta asociada. Esta cuenta debe de tener los suficientes permisos para poder realizar todas las tareas que tu servicio requiera, de otro modo tendrás problemas.


La franja horaria es GMT +2. Ahora son las 20:24:51.

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