[Builder]jak zrobić windows service?

0

Czy ktokolwiek wie jak zrobić windows service w Builderze? Serwis musi uruchamiać mój program po starcie systemu i pozostawac w pamięci jako rezydent, aby pomownie uruchomić sie w przypadku wystąpienia określonego zdarzenia (konkretnie: musi co pewnie czas przeglądać tablice z danymi, czy też wykonywac jakąkolwiek inną funkcje, i przy zajściu odpowiednich okoliczności uruchomić sie ponownie).

Wiem że należy wybrać odpowiedni typ aplikacji (service application) i zapewne w metodzie AfterInstal wpisać odpowiedni kod (chyba chodzi o dodanie nowego klucza do rejestru, tylko nie wiem jak to zapisac). Wiem też że później trzeba będzie aplikacje zainstalowac z wiersza poleceń. Ale nie mam pojęcia jak sie do tego zabrać. Jezeli ktoś juz to robił to z góry dzięki za wszelkie wskazówki!

0

Ponieważ nikt nie był w stanie odpowiedzieć na moje pytanie to bede musiał chyba sam to zrobić :-P . Moze komuś sie to przyda. Metodą prób i błędów doszedłem do tego jak to zrobić. A i teraz pojawiły się nowe pytania na które moze ktoś bedzie potrafił mi odpowiedzieć.

Aby dodać nowy klucz do rejestru, tak aby dany program był uruchamiany przy starcie systemu należy napisać taką funkcje (potrzebne bibloteki: Registry.hpp, string.h):

void NowyKlucz(AnsiString KeyName)
{
TRegistry *Registry = new TRegistry(KEY_WRITE);
Registry->RootKey = HKEY_CURRENT_USER;
Registry->OpenKey("SOFTWARE\Microsoft\windows\CurrentVersion\Run",FALSE);
Registry->CreateKey(KeyName);
Registry->OpenKey(KeyName,FALSE);
Registry->WriteString("Nazwa_Programu","Ścieżka\Nazwa_Programu.exe");
Registry->CloseKey();
}

Usuniecie tego klucza:

void UsunKlucz(AnsiString KeyName)
{
TRegistry *Registry = new TRegistry(KEY_WRITE);
Registry->RootKey = HKEY_CURRENT_USER;
Registry->OpenKey("SOFTWARE\Microsoft\windows\CurrentVersion\Run",FALSE);
Registry->DeleteKey(KeyName);
Registry->CloseKey();
}

Aby zrobić windows service który uruchamia inny program należy:

  1. Wybrać aplikacje Windows Service(FILE/NEW/OTHER zakładka NEW Service Application, niedostępna w wersji personal).
  2. W zdarzeniu OnExecute wpisać nastepujący kod (dołaczyć bibloteke process.h)

while(1)
{

      if("określić wsarunki")
      {
      spawnl(P_NOWAIT,"Ścieżka\Nazwa_Progarmu.exe" ,"Nazwa_Programu, NULL);
      }

}
3.Zmienić włąściwość Interactive na TRUE.
4.Skompilować i z wiersza poleceń zainstalować:
Nazwa_Progarmu\install (uninstall - odinstalkowanie)
5. Serwis zacznie działać po ponownym uruchomieniu kompa.

Jak widziecie w funkcji OnExecute urzyłem nieskończonej pętli... rozwiązanie mało eleganckie ale tu skuteczne. Myślę ze powinno sie to zrobić inaczej, wykorzystując właściwość WaitHint, która ustala czas pomiędzy kolejnymi odpaleniami funkcji OnExecute, ale nie wiem dlaczego nie działa (funkcja OnExecute wykonywana jest tylko raz, raz powinna byc wykonywana funkcja OnStart(!)). Poza tym z niaznanych mi powodów gdy próbuje sie odwołać do rejestrów w funkcji OnExecute (aby odczytać jego wartość, w której zapisywałem stan mojego programu - 1 uruchomiony, 0 - niedziała) proces został zakończony(!) - czy ktoś moze wie dlaczego (mam WinXP)?

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