Jeg har den opfattelse at når man starter en service, OnStart event bliver kaldt og er i en "løkke" indtil OnStop bliver kaldt. Men ShellChangeNotifier har også sin egen event OnChange og der i laver man så sin kode for hvad der skal ske. Men hvordan får jeg det "flettet" ind i hinanden?
Jeg kan ikke se at det skulle give dig problemer.. event flowet i en Service er mangen til det du har i en almindelig exe fil.
TShellChangeNotifier er interne implmenteret vha en tråd (TShellChangeThread) som kører i et uendeligt loop med en klasisk FindFirstChangeNotification .. FindNextChangeNotification algoritme. Ved ændringer notificerer den dig, på almindelig Borland event basis.
Forbeholdt at den er implemteret i en tråd, kan jeg ikke se at det skulle volde dig problemer at køre den i en service. Gør det det aligevel, kan du vel bare slev implementere funktionen der holder øje med ændringer i et biblotel eventuelt med under bibloteker. Det er ikke ret svært.
Ja, det ved jeg ikke om jeg har, men jeg har prøvet sådan som beskrevet og lavet en :
procedure TService1.ShellChangeNotifier1Change; begin if findfirst(ShellChangeNotifier1.Root + '*.ilp',faAnyFile,sr) = 0 then begin FileName := ShellChangeNotifier1.Root + sr.Name; LogMessage(FileName,EVENTLOG_INFORMATION_TYPE); Beep; end; end;
men der sker ikke noget. Jeg ville jo godt have at den bipper når en fil med *.ilp bliver oprettet.
Jeg har en lille opgave som går ud på at lave en service som tager hånd om nogle filer. Biblioteket som servicen skal overvåge skal jeg overfører via en parameter. På et eller andet plan ser det ud til, at jeg har lavet den del af det også alligevel ikke. Hvis jeg skriver "/s:c:\test" i SCM får jeg ganske rigtigt "c:\test" smidt i Service1.ShellChangenotifier1.root, men det virker ikke. Hvis jeg derimod hardkoder det ind i servicen hvilket bibliotek det skal være med "/l", spiller det.
Min kode for at tage fat i parameterne ser sådan ud:
procedure TService1.ProcessCmdLineParameters; var Count : Byte; begin For count := 0 to ParamCount-1 do Begin Case Param[Count][2] Of 'S','s' : Service1.ShellChangeNotifier1.Root := Copy(Param[Count], 4, Length(Param[Count]) - 3); 'L','l' : Service1.ShellChangeNotifier1.Root := 'c:\test'; 'D','d' : Debug := true; end; End; end;
procedure TService1.ServiceStart(Sender: TService; var Started: Boolean); begin ProcessCmdLineParameters; TShellChangeThread.Create(IshojLabelPrint.ShellChangeNotifier1Change); if Debug then begin LogMessage('Path to check : "' + ShellChangeNotifier1.Root + '"',EVENTLOG_INFORMATION_TYPE); LogMessage(inttostr(length(ShellChangeNotifier1.Root)),EVENTLOG_INFORMATION_TYPE); LogMessage('Service started.',EVENTLOG_AUDIT_SUCCESS); end; Started := true; end;
procedure TService1.ShellChangeNotifier1Change; begin if Debug then begin LogMessage('Thread startet',EVENTLOG_INFORMATION_TYPE); LogMessage(ShellChangeNotifier1.Root,EVENTLOG_INFORMATION_TYPE); end; if findfirst(ShellChangeNotifier1.Root + '\*.ilp',faAnyFile,sr) = 0 then begin FileName := ShellChangeNotifier1.Root + '\' + sr.Name; if Debug then LogMessage(FileName,EVENTLOG_INFORMATION_TYPE); Beep; end; end;
En lille mindre detalje: procedure TService1.ServiceStart(Sender: TService; var Started: Boolean); begin ProcessCmdLineParameters; TShellChangeThread.Create(Service1.ShellChangeNotifier1Change); if Debug then begin LogMessage('Path to check : "' + ShellChangeNotifier1.Root + '"',EVENTLOG_INFORMATION_TYPE); LogMessage(inttostr(length(ShellChangeNotifier1.Root)),EVENTLOG_INFORMATION_TYPE); LogMessage('Service started.',EVENTLOG_AUDIT_SUCCESS); end; Started := true; end;
Jens B. Kendte du noget til hvordan man overfører parameter fra en service?
/kenneth
Synes godt om
Ny brugerNybegynder
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.