Newsgroup: it.comp.lang.delphi
Titolo: Problemi avvio servizio

Salve, ho creato un servizio che risponde al telefono e salva su
database firebird i dati. Ho inserito una trayicon e una piccola form
con un memo per visualizzare il log delle chiamate. Il servizio funziona
e fa il suo lavoro ma ho un piccolo problema.
In pratica non si avvia normalmente quando si avvia il pc.
Ho inserito fra le dipendenze quella di firebird in modo che si avvii
dopo che il server di firebird sia attivo, ma controllando nella lista
dei processi il servizio è in esecuzione per qualche secondo dopo
l'avvio del pc e dopo si chiude automaticamente.
L'unica cosa che mi avvia il servizio è fare il classico: net start
NOMESERVIZIO (fra l'altro se metto il comando in un file .bat in
esecuzione automatica mi da pure qualche problemino).
Il problema è che questo servizio deve avviarsi automaticamente senza
che nessuno faccia il login.
Le impostazioni d'avvio penso che siano corrette e sono quelle di
default infatti se creo un servizio nuovo di prova questo si avvia
normalmente al boot e rimane in esecuzione.
Qualcuno ha mai avuto problemi del genere o sa darmi qualche consiglio?
Grazie

Qualcuno ha mai avuto problemi del genere o sa darmi qualche consiglio?
Bisognerebbe guardare il codice...

 In pratica non si avvia normalmente quando si avvia il pc.
Ho un'applicazione simile creata una decina di anni fa per win NT4, č un 
data logger che riceve i dati da una multiseriale e crea dei file che 
verranno poi gestiti da un'altra applicazione. Gira come servizio ed ha 
una trayicon per accedere ad una finestra di debug/monitor e per 
lanciare  l'applicazione di elaborazione.
Concettualente quindi molto simile alla tua.
Ricordo che a suo tempo dovetti risolvere un paio di problemini legati 
principalmente al fatto che i servizi non hanno handle di finesta. 
Quindi ho fatto in modo di intercettare il login e logout dell'utente 
prima di creare/distruggere la trayicon e qualsiasi cosa interattiva.
Non trovai allora API standard per risolvere la questione e fu un 
discreto rompicapo, credo alla fine di essermi affidato 
all'identificazione dei processi in esecuzione.
Non posso dirti di piů perchč č passato molto tempo e fortunatamente 
(quasi non ci credo ancora) il servizio non ha subito sostanziali 
aggiornamenti ed č sopravvissutto ai successivi 2000/XP/2003 senza dare 
noie.

 l'avvio del pc e dopo si chiude automaticamente.
1) togli quanto è VISUALE dal servizio
2) aggiungi del codice che gestisce un file di log
3) riempi il codice di try..except specie nei pnti critici e le 
eccezioni le scrivi sul file di log.
A

 >
Rispondo qui anche alla richiesta di Andrea
Nel progetto faccio uso dei componenti Jedi e degli AsyncPro
Nel servizio sono presenti:
- 3 timer (tutti disattivati all'inizio)
- 1 TApdTapiDevice (Disattivato all'inizio)
- 1 TApdComPort (Legato al componente precedente e quindi disattivato)
- 1 TApdTapiStatus (Legato al TapiDevice)
- 1 TApdDataPacket (Legato al TapiDevice)
Questi componenti a parte il TapiStatus che si attiva quando arriva una
telefonata sono tutti non visuali.
Di visuale c'č:
- 1 TPopupMenu
- 1 TJvTrayIcon (che č visibile quando il servizio č attivo)
- 1 TJvDesktopAlert e quindi un TJvDesktopAlertStack (mi servono per
visualizzare dei messaggi su particolari eventi per esempio telefonata
chiusa ecc)
Oltre a questi componenti faccio uso di una form dove c'č una memo che
visualizza il log delle operazioni.
Il problema č che anche commentando tutto il codice relativo
all'inizializzazione dei componenti e dei loro eventi oltre alla
creazione della form, quindi "in teoria" il servizio non dovrebbe fare
nulla, c'č sempre lo stesso problema: si avvia per qualche secondo e poi
si chiude. L'ho provato su piů computer e ho sempre lo stesso problema.
La cosa strana č che il servizio funziona bene se lo avvio dopo che ho
fatto il login e lo lancio con il net start.
Farň la prova di levare tutti i componenti visuali e vedere che
risultati ottengo. Beh con il codice commentato non vedo punti critici
da loggare  :-(  cmq vi farň sapere.
Grazie ancora per i consigli
Fabrizio

si chiude.
Scusa, ma se non implementi il loop principale del servizio, è ovvio
che questo succeda!... anche le applicazioni a finestre hanno alla
base un loop.  L'applicazione termina quando si esce dal loop.

Andrea Laforgia ha scritto:

Beh ma non dovrebbe avere lo stesso problema anche quando l'avvio dopo
aver fatto il login? O c'è qualcosa che mi sfugge per la fase di avvio?
Penso che il loop lo dovrei gestire se scrivessi da zero un servizio, ma
uso il template per la creazione e derivo tutto da TService.
Ho provato a fare un servizio senza nessun componente (usando tutte le
impostazioni di default, e creato automaticamente da delphi/Builder) e
il servizio si avvia e resta attivo senza un rigo di codice aggiunto.
Mi sono accorto invece che se creo un servizio mettendo solo i due
componenti  TApdTapiDevice e TApdComPort il servizio si chiude in fase
di avvio. Questo accade impostando la proprietà Interactive sia a true
che a false; ovviamente il TApdComPort non apre nessuna porta.
Non ho molta esperienza con i servizi, ma leggendo l'help non ho visto
degli accorgimenti particolari.
Sto usando il Builder 5 e Async PRO 4.07
Non l'avevo detto ma a scanso di equivoci installo il servizio nel
sistema con NOMESERVIZIO /install
Fabrizio

degli accorgimenti particolari.
Tutt'altro, invece.  In ogni caso, bisognerebbe vedere il tuo codice.

 sistema con NOMESERVIZIO /install
Senza vedere un po' di codice ogni ipotesi e' plausibile. Poi, non hai
ancora detto su quale sistema operativo stai lavorando. Inoltre, siamo
sicuri che sia un problema del servizio in se' e non dei componenti i
quali - faccio delle ipotesi, non li ho mai usati - lavorando
sull'hardware, necessitano che tutti i driver siano correttamente caricati
e i dispositivi correttamente inizializzati?
Ciao
ACSH
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ACSH
Ho fatto le prove su un winxp pro e un windows server 2003 ma ottengo
gli stessi problemi.
Gli unici componenti che si interfacciano all'hardware (modem in questo
caso) non accedono alla porta se non quando si chiama la procedura Open
o AutoAnswer.. Posso provare a mettere un bel delay su l'oncreate del
servizio per aspettare che tutto sia attivo, ma in ogni caso quando
usavo il codice del servizio completo e impostavo le dipendenze con il
servizio di firebird effettivamente si attivava dopo che firebird fosse
in esecuzione e penso che già il sistema avesse tutto pronto.
Posto il codice scritto in c++ e penso che non ci siano problemi data la
parentela con delphi
File ProvaService.cpp:
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
  try
  {
     Application->Initialize();
     Application->CreateForm(__classid(TServizioProvaf), &ServizioProvaf);
     Application->Run();
  }
  catch (Exception &exception)
  {
      Sysutils::ShowException(&exception, Sysutils::ExceptAddr());
  }
  return 0;
}
File Main.cpp
//---------------------------------------------------------------------------
#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "AdPort"
#pragma link "AdTapi"
#pragma resource "*.dfm"
TServizioProvaf *ServizioProvaf;
//---------------------------------------------------------------------------
__fastcall TServizioProvaf::TServizioProvaf(TComponent* Owner)
	: TService(Owner)
{
}
TServiceController __fastcall ServizioProvaf::GetServiceController(void)
{
   return (TServiceController) ServiceController;
}
void __stdcall ServiceController(unsigned CtrlCode)
{
   ServizioProvaf->Controller(CtrlCode);
}
//---------------------------------------------------------------------------
Anche se non ci sono tutte le proprietà dei componenti, includo pure il
file main.dfm:
object ServizioProvaf: TServizioProvaf
  OldCreateOrder = False
  AllowPause = False
  DisplayName = 'ProvaDiServizio'
  Left = 232
  Top = 146
  Height = 656
  Width = 952
  object ApdTapiDevice1: TApdTapiDevice
    ComPort = ApdComPort1
    ShowTapiDevices = True
    ShowPorts = True
    EnableVoice = False
    Left = 40
    Top = 56
  end
  object ApdComPort1: TApdComPort
    ComNumber = 3
    AutoOpen = False
    TraceName = 'APRO.TRC'
    LogName = 'APRO.LOG'
    TapiMode = tmOn
    Left = 120
    Top = 56
  end
end
E questo è tutto, come si può notare è un servizio con 2 componenti che
"non fa nulla".
Fabrizio

 in esecuzione e penso che già il sistema avesse tutto pronto.
Hai naturalmente inserito anche una dipendenza dal servizio TAPI (o
comunque si chiami sulla versione di Win che usi).
Saluti
Paolo Arosio

 Paolo Arosio
Che domande!!! Ovvio che no! :-D altrimenti come impazzivo in questi
giorni? ;-) Beh avevo pensato a firebird e avevo completamente
tralasciato il servizio TAPI come se non fosse stato importante...
Mi ero chiuso e pensavo a tutt'altro tipo di problemi.
Adesso funziona tutto, grazie ancora.
Fabrizio