Zmagam się z aplikacją serwisową. Początkowo napisałem zwykły programik ale później przerobiłem na service i poza tym że nie działa tak jak powinen to mam jeszcze większy problem: klikam RUN i po paru sekundach sama się zamyka bez zgłaszania żadnych błędów. Co dziwniejsze to samo się dzieje jak tworzę nową przez File>New> Service application, pustą w środku. Po paru sekundach działania sama się wyłącza [???]
Spotkał się ktoś z takim zachowaniem?
win xp i delphi 7.2 pro SE
Tak spotkał się z taką sytuacją...
w kodzie masz mieć:
procedure TService.ServiceExecute(Sender: TService);
begin;
while not Terminated do
ServiceThread.ProcessRequests(True);
end;
dodałem i nic się nie zmieniło
Zapewne apliacja robi jakis Exception.
Zrób sobie tak, żeby wszystko co robisz opakowane było klauzulami try ... except ... end i w momencie wystąpienia błędu - zrzucaj to do pliku.
Jak sobie z tym nie poradzisz - daj znać - wrzuce ci przykłąd jak ja to robię.
no właśnie nie robi zupełnie nic
jak mam aplikację z template to też się sama zamyka po 10s mniejwięcej. delphi nie pokazuje błędów
unit:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs;
type
TService1 = class(TService)
procedure ServiceExecute(Sender: TService);
private
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;
var
Service1: TService1;
implementation
{$R *.DFM}
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
Service1.Controller(CtrlCode);
end;
function TService1.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TService1.ServiceExecute(Sender: TService);
begin
while not Terminated do
ServiceThread.ProcessRequests(True);
end;
end.
dodałem tam jak widać
procedure TService1.ServiceExecute(Sender: TService);
begin
while not Terminated do
ServiceThread.ProcessRequests(True);
end;
ale to nic nie zmieniło
dpr:
program Service;
uses
SvcMgr,
Unit1 in 'Unit1.pas' {Service1: TService};
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TService1, Service1);
Application.Run;
end.
No, aplikacja z template po mojemu nie robi nic i dlatego się po prostu kończy.
Może to Ci pomoże:
http://www.tolderlund.eu/delphi/service/service.htm
Aplikacja otwierająca się jako service działa przed zalogowaniem i chyba o to chodzi? Bo w przypadku restartu zdalnego serwera nie następuje logowanie i nie działałyby nasze aplikacje. Jest jednak inne wyjście. Spotkałem się z programem (nie pamiętam jego nazwy) który po zainstalowaniu i zresetowaniu systemu powoduje automatyczne zalogowanie a następnie (po uruchomieniu programów w autostarcie) wylogowuje użytkownika a te programy oczywiście dalej działają, czyli już nie muszą działać jako service. Nie wiem czy łatwo napisać taki program. Tamten kosztował jakieś 20 dolarów.
jak się okazało gotowa i zainstalowana usługa działa po restarcie normalnie - tzn się sama nie wyłącza. tylko przy uruchamianiu spod delphi tak dziwnie się zachowuje
Nie dziwnie. Normalnie.
Aplikacja komplilowana pod usługę ma się skompilować i tyle. Po skompilowaniu masz ją wystartować (NET START <service_name>), a przed rekompilacją zastopować (NET STOP <service_name>) - oczywiście wszystko możesz robić z poziomu "Managera Usług", ale mnie jest wygodniej robić to z poziomu wiersza poleceń - szczególnie jak masz przygotowane skrypty - możesz jednym ruchem wyczyścić całe środowisko.
Nie wiem jak jest w najnowszych Delphi (ponoć w 2010 coś dorobili), ale nie można np debuggować wprost Aplikacji usługowych (ja radze sobie logowaniem działania aplikacji do plików logu). W każdym razie w Delphi 7 jest to najnormalniejsze zachowanie.
hmm.. tak z ciekawosci zapytam: a jakby uruchomic delphi jako "SYSTEM", to by cos zmienilo? moze daloby sie debugowac ;]
Nie jestem pewien, czy możesz sie zalogować w trybie interaktywnym jako SYSTEM (zapewne dałoby się jakoś przestawić zasady polis). A czy uda ci sie zrobić Run-as - nie wiem - pytanie jakie jest hasło.
Poza tym - nie wiem, czy nie jest tak, że Delphi samo z siebie po prostu ubija aplikację.
No ale - ja za cienki w uszach jestem, to nie bede sie autorytatywnie wypowiadał - od strony systemu nie bardzo widze jakby to ugryźć.
ja odpalilem sobie (na xp) calego explorera jako system...
podmienilem w rejestrze wygaszacz ekranu na cmd.exe i usawilem jakis maly czas rzedu kilku sekund.
przy logowaniu zamiast wygaszacza wlacza sie wiersz polecen - jest uruchomiony jako system.
wszystko, co sie odpali spod niego tez jest jako system. tylko nie zamykac cmd bo przywroci okno logowania.
druga metoda jaka udalo mi sie uruchomic program jako system bylo dodanie uruchomienia do harmonogramu zadan, konkretnie poleceniem "at" w wierszu polecen. ale z tego co pamietam, to po uruchomieniu okno programu nie bylo widoczne. nie bawilem sie tym dalej.
Attach to process jest tez w miare pomocny. Wywali Ci przynajmniej exceptiony. A w jakim miejscu to albo zapisywanie logow , czyli taki showmessage :D
albo zdecydowanie lepszy sposob, przy dosc zlozonych serwisach to taki ze na szybko przeklejamy zawartosc do okienkowej aplikacji, maly lifting i od razu widac co schrzanilo sie :D
No coz. Zdarzaja sie bledy typowe dla usług, które pojawiają się tylko w srodowisku działania usługi.
Logowanie do pliku działa niezawodnie, a odpowiednio zaprojektowane pozwala regulowac poziom logowania.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.