Witam
mam napisana usługę. dodałem do niej opcję upgrade. Jak zrobić restart tej usługi - najlepiej żeby to ten serwis restartował sam siebie.
Macie jakieś pomysły ??
Chyba sie nie da żeby restartowal sam siebie.
Wywołać skrypt w powershellu?
Program nie może sam siebie zrestartować, bo jeśli zakończy działanie, to już żadnego kodu nie wykona. Tak samo nie może sam siebie usunąć czy zmodyfikować zawartości pliku wykonywalnego, z którego dany proces został uruchomiony.
Żeby to obejść, stosuje się różnego rodzaju skrypty (choćby stare dobre pliki .bat
) lub zewnętrzne programy, które czekają aż dany proces zakończy działanie, następnie uruchamiają go i same się zamykają – całość jest niewidzialna dla użytkownika.
A nie lepiej zrobić to po ludzku? Oddzielna usługa (włączana na żądanie) aktualizująca program/usługę główną? Usługa główna sprawdza czy jest aktualizacja, jeśli jest uruchamia usługę aktualizacji, wyłącza się sama. Po skończonej aktualizacji proces aktualizujący odpala usługę główną i się sam wyłącza.
To jest trochę obejście, ale można wymusić restart poprzez wywołanie błędu (nie wiem, jak to się robi), a w konfiguracji usługi ustawić, że w przypadku wystąpienia pierwszego, drugiego i kolejnego błędu uruchomić ponownie usługę.
furious programming napisał(a):
Program nie może sam siebie zrestartować, bo jeśli zakończy działanie, to już żadnego kodu nie wykona. Tak samo nie może sam siebie usunąć czy zmodyfikować zawartości pliku wykonywalnego, z którego dany proces został uruchomiony.
Żeby to obejść, stosuje się różnego rodzaju skrypty (choćby stare dobre pliki
.bat
) lub zewnętrzne programy, które czekają aż dany proces zakończy działanie, następnie uruchamiają go i same się zamykają – całość jest niewidzialna dla użytkownika.
uses shellapi ///// przykład na restart programu
procedure TForm1.Button1Click(Sender: TObject);
begin
ShellExecute(Handle,'Open',PChar(paramstr(0)), nil,nil,sw_show);
Application.Terminate;
end;
aplikacja może usunąć się sama siebie. Tak działają właśnie wirusy.
Plik wykonywalny może się zmodyfikować poprzez tworzenie pliku ~.temp a poprzez pliki wsadowe .bat.dopisanie do nich wartości. Po czym plik oryginalny jest usuwany a działa plik z wirusem.
Tomek Pycia a jak myślisz jak są obliczane wielkie liczby pierwsze?
Bruno(M) napisał(a):
uses shellapi ///// przykład na restart programu
procedure TForm1.Button1Click(Sender: TObject); begin ShellExecute(Handle,'Open',PChar(paramstr(0)), nil,nil,sw_show); Application.Terminate; end;
To jest bardzo słaby sposób.
Jeśli aplikacja wykorzystuje relatywnie dużo pamięci i podczas zamykania zwalnia kupę danych, to proces nie zdąży tej pamięci zwolnić, pozapisywać danych i się zamknąć przed uruchomieniem drugiej instancji. Jeśli do tego mamy blokadę tylko na jedną instancję, to ten restart w najlepszym wypadku nie zadziała w ogóle, a w najgorszym, obie instancje będą walczyć o dane z plików (stara instancja zapisuje, nowa odczytuje) i powstanie bajzel. Wystarczy że zamykanie procesu potrwa sekundę i już dupa zbita.
Lepiej po prostu skorzystać z konkretnych mechanizmów systemowych (o których sam zostałem poinformowany – za co dziękuję) lub wykorzystać zewnętrzne mini-programy/pliki wsadowe, które najpierw poczekają na zakończenie bieżącej sesji, a dopiero po tym odpalą nową (i się zamkną).