Monitor aplikacji, resetowanie zewnętrznej aplikacji

0

Witam,
Mam pewną aplikacje, którą w razie błędu wykonywania .exe, albo zawieszenia, ewentualnie utraty połączenia z serwerem chciałbym zresetować zewnętrznym programem, który działa w pętli w tle.

Obecnie problem ten zrealizowałem w ten sposób. Wczytałem DLL-ke do tej aplikacji, którą chce monitorować. Założony jest hook na funkcje recv(). Jeżeli moja DLL-ka wykryje, że ostatni pakiet został otrzymany dłużej niż minute temu to korzystając z exit() zamyka aplikacje.
poza tym w DLL mam pewne funkcje sterujące aplikacją, którą to także chce monitorować.

Oddzielny program w pętli poprzez FindWindow() zwraca po nazwie okna, że HWND == NULL, więc uruchamia ją ponownie wykorzystując ShellExecute(), następnie seria Sleep() w połączeniu z PostMessage() dla przesłania pewnych informacji do tej aplikacji i już śmiga.

Jednak zaczęło mi to nie wystarczać.
Chciałbym uruchomić takich aplikacji więcej niż jedną. Wykonanie tego poprzez nazwy okien jest niemożliwe, ponieważ już będzie więcej niż jedna takich samych nazw okien w systemie i moja aplikacja do resetowania zgłupieje.

Jak najlepiej/najprofesjonalniej rozwiązać ten problem?
Warunek:

  1. Między programem resetującym, a DLL-ką zachodzi możliwość dwustronnej wymiany informacji.
  2. Możliwość powielenia w/w wiązanki w systemie, bez kolizji.
    Czyli jeżeli TCP/IP to chyba różne porty, losowane na początku, zapisywane do pliku i następnie wczytywane do bindu przez drugą aplikacje.
    ... a może do tego celu są jakieś specjalne narzędzia?
0

napisz sobie usługę, która w tle będzie monitorować co jest uruchomione, a co nie, wymagane prawa admina do instalacji usługii, co do komunikacji pomiędzy procesami są różne metody, współdzielona pamięć, ale chyba najlepiej wyjdziesz jeśli skorzystasz z named pipes

0
Bartosz Wójcik napisał(a)

napisz sobie usługę, która w tle będzie monitorować co jest uruchomione, a co nie, wymagane prawa admina do instalacji usługii, co do komunikacji pomiędzy procesami są różne metody, współdzielona pamięć, ale chyba najlepiej wyjdziesz jeśli skorzystasz z named pipes

buahahaha... to żeś odkopał stary temat xd
no i w dodatku zakładanie usługi ma się nijak do problemu, chyba tego nie rozumiesz...

ale jako, że temat został odkopany i nie ma rozwiązania "takiego żeby się nie narobić", a może komuś się kiedyś przyda...
imo w takim wypadku najlepiej:
-teraz odwrotnie, czyli w aplikacji resetującej zrobić jakieś HWND
-w aplikacjach które mogą być uruchamiane w wielu instancjach, szukać tego okna aplikacji resetującej (FindWindow)
-po znalezieniu wysłać mu jakiś message PostMessage(hAplikacajResetująca, WM_USER_ADDCREATED, 0, 0);
-aplikacja resetująca dostając taki event wiedziała by że właśnie uruchomiono nową instancję tego programu i trzeba dodać ją do listy uruchomionych
-a samo sprawdzanie czy wszystkie HWND z listy uruchomionych nadal istnieją - to wystarczy: IsWindow po kolei dla okien w tej liście
-i problem rozwiązany

0

Usługa w tym wypadku będzie idealnym rozwiązaniem na monitorowanie czy coś nie padło, ponieważ będzie automatycznie startowana przez Windows i Windows będzie sprawdzał czy ona sama ciągle działa i ewentualnie ją restartował, kwestia wygody i wykorzystania mechanizów już wbudowanych w Windows. Sprawdź sam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1