Avatar billede hugopedersen Nybegynder
04. september 2009 - 10:09 Der er 15 kommentarer og
1 løsning

Program som service

Jeg har et program som det er rimeligt vigtigt at der bliver ved med at køre, men af forskellige årsager kan det ske at programmet lukker ned.
Jeg kunne så forestille mig at man lavede et lille program der ruller som en service og står og holder øje med om processen for det andet program findes. Hvis ikke skal den så starte det.
Jeg vil mene at hvis utilitien er lavet som en service vil man kunne være rimelig sikker på at den bliver ved med at køre. Man kan vel sætte maskinen til at boote hvis den fejler.

Lyder det helt ude i hampen eller hvad?

Hvis ikke hvor skal jeg så lede for at finde inspirration til at lave sådan et service program?

(Jeg har ingen mulighed for at ændre i programmet der skal køre hele tiden)
Avatar billede hrc Mester
04. september 2009 - 10:14 #1
Du behøver ikke lede længe. Bare gå til File, New, Other og vælg Service Application. Det er stort set alt. Når dit program fungerer tilfredsstillende kopierer du koden over i service-projektet og oversætter det. Du installerer servicen med /install og afinstallerer med /uninstall.

Læs mere her
http://www.tolderlund.eu/delphi/service/service.htm
http://www.devarticles.com/c/a/Delphi-Kylix/Creating-a-Windows-Service-in-Delphi/
http://articles.techrepublic.com.com/5100-10878_11-1050538.html (måske lidt gammel)
Avatar billede hrc Mester
04. september 2009 - 10:16 #2
Løsningen med at have en service til at holde øje med et andet, er brugt mange steder, men især inden for database-verdenen hvor Firebird bl.a. en service (Guardian) der holder den kørende.
Avatar billede hugopedersen Nybegynder
04. september 2009 - 10:18 #3
OK - så er jeg ikke 'helt ude i hampen' alligevel :-)
Avatar billede hrc Mester
04. september 2009 - 10:19 #4
Løsningen er ikke her, men måske kan det her bruges et sted: http://edn.embarcadero.com/article/25802
Avatar billede hrc Mester
04. september 2009 - 10:28 #5
Kunne vist ikke bruges alligevel, men jeg synes det ligger lidt sløvt til mht. at finde relevante links.
Avatar billede hrc Mester
04. september 2009 - 10:29 #6
... og så fandt jeg dette link:

http://www.delphifaq.net/how-to-find-out-if-a-program-is-running/

Linket lyder som noget du kan bruge.
Avatar billede hugopedersen Nybegynder
04. september 2009 - 10:56 #7
Merlin - får mig til at tænke tilbage til de gode gamle Commodore 64 dage. Det var mit handle når der blev ændret i programmer (hvis du forstår)
Jeg kigger lige links igennem og ser hvad jeg kan bikse sammen.

Men du kan godt forberede et svar.
Avatar billede hrc Mester
04. september 2009 - 11:10 #8
Måtte rette i gamle Merlins kode. Det her virker hos mig på en D2009'er

unit UWinProcesses;

interface

uses
  SysUtils, Classes, Windows, TlHelp32;

function IsProcess(aExename: string): Boolean;
procedure GetProcesses(aProcessList: TStringList);

implementation

function IsProcess(aExename: string): Boolean;
var
  found: boolean;
  lSnapShot: cardinal;
  foundname: string;
  rProcess: TProcessEntry32W;
begin
  Result := False;
  aExeName := UpperCase(aExeName);
  lSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if lSnapShot <> 0 then
  begin
    rProcess.dwSize := SizeOf(rProcess);
    found := TlHelp32.Process32First(lSnapShot, rProcess);
    while found do
    begin
      foundname := string(rProcess.szExeFile);
      if Pos(aExeName, UpperCase(foundname)) <> 0 then
      begin
        Result := True;
        Break;
      end;
      found := Process32Next(lSnapShot, rProcess);
    end;
    CloseHandle(lSnapShot);
  end;
end;

procedure GetProcesses(aProcessList: TStringList);
var
  Found: boolean;
  lSnapShot: cardinal;
  rProcess: TProcessEntry32W;
begin
  aProcessList.BeginUpdate;
  try
    aProcessList.Clear;
    lSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if lSnapShot <> 0 then
    begin
      rProcess.dwSize := SizeOf(rProcess);
      Found := Process32First(lSnapShot, rProcess);
      while Found do
      begin
        aProcessList.Add(rProcess.szExeFile);
        Found := Process32Next(lSnapShot, rProcess);
      end;
      CloseHandle(lSnapShot);
    end;
  finally
    aProcessList.EndUpdate;
  end;
end;
Avatar billede hrc Mester
04. september 2009 - 11:17 #9
Kan ikke stoppe (hader at bruge break):

function IsProcess(aExename: string): Boolean;
var
  OK: boolean;
  lSnapShot: cardinal;
  rProcess: TProcessEntry32W;
begin
  result := false;
  aExeName := UpperCase(aExeName);

  lSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if lSnapShot = 0 then
    exit;
  try
    rProcess.dwSize := SizeOf(rProcess);
    OK := TlHelp32.Process32First(lSnapShot, rProcess);
    while OK and not result do
    begin
      result := Pos(aExeName, UpperCase(string(rProcess.szExeFile))) > 0;
      if not result then
        OK := Process32Next(lSnapShot, rProcess);
    end;
  finally
    CloseHandle(lSnapShot);
  end;
end;
Avatar billede hrc Mester
04. september 2009 - 11:21 #10
Undskyld, det er mig igen. Fandt lige dette link som nok er værd at kigge lidt på:

http://forum.lazarus.freepascal.org/index.php?topic=7035.0

(hvis du ikke har opdaget det, så synes jeg emnet har været interessant)
Avatar billede hugopedersen Nybegynder
04. september 2009 - 11:51 #11
Jamen nu har jeg også fået et program der ser ud til at fungere.
Jeg skal så bare lige have det lavet om til en service :-)
Avatar billede hugopedersen Nybegynder
07. september 2009 - 12:03 #12
Og som en service er man afskåret fra visuelle komponenter :-(

Hvad gør man så når man gerne vil have et trayicon og mulighed for at manipulere det (alive/warning)
Avatar billede hrc Mester
07. september 2009 - 14:36 #13
... tror ikke det er i servicen man har den funktionalitet. Den kommunikerer kun til event-loggen.

Det program som holdes i live kan du derimod jo lave tray-ikonen på og der også lave menupunkter der kører net start/stop på servicen (kan nok gøres uden at køre kommandolinjeprogrammer).
Avatar billede hugopedersen Nybegynder
08. september 2009 - 14:59 #14
Desværre har jeg ingen mulighed for at lave noget i programmet der skal overvåges.
Avatar billede hrc Mester
09. september 2009 - 13:37 #15
Så tror jeg løsningen er et lille tray-program.
Avatar billede hugopedersen Nybegynder
09. september 2009 - 14:13 #16
Jo men så er jeg jo ligesom ikke bedre stillet igen. Hele ideen var at servicen jo startes af OS og derfor med stor sandsynlighed bliver startet ved genstart.
Problemet er jo at det oprindelige program nogen gange ikke starter og så skulle service jo klare det.

Men jeg har så også fået lavet noget der ser ud til at fungere helt i baggrunden.
De par hurdles der er tilbage tror jeg ikke er servicens skyld. Det kaldte program kræver at poweroptions er sat til presentation, men det kan den ikke læse hvis det er startet fra servicen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester