Avatar billede kennethv Nybegynder
07. september 2005 - 17:48 Der er 13 kommentarer og
1 løsning

Hvordan bruges ShellChangeNotifier sammen med en NT Service?

Hvem kender til ShellChangeNotifier sammen med en NT Service?
Avatar billede borrisholt Novice
08. september 2005 - 06:29 #1
Jeg har aldrig arbejdet med ShellChangeNotifier måske du kan fortælle hvqad du gerne vil ....

Jens B
Avatar billede kennethv Nybegynder
08. september 2005 - 09:14 #2
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?
Avatar billede borrisholt Novice
08. september 2005 - 10:49 #3
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.

Jens B
Avatar billede kennethv Nybegynder
08. september 2005 - 11:11 #4
:)
Jeg er lidt a novice til det her. Så hvis du kunne give et eksempel på det vil det bare være stort.

Kenneth V.
Avatar billede kennethv Nybegynder
08. september 2005 - 11:13 #5
Hov, jeg glemte at nævne at jeg har forsøgt, men uden resultat. Jeg er den type der prøver før jeg kommer som et bøjet søm.

Kenneth V.
Avatar billede kennethv Nybegynder
08. september 2005 - 11:56 #6
har klaret det tror jeg.

TShellChangeThread.Create(Service1.ShellChangeNotifier1.OnChange);
Avatar billede kennethv Nybegynder
08. september 2005 - 13:30 #7
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.

Kenneth V.
Avatar billede borrisholt Novice
08. september 2005 - 14:13 #8
Ja jeg har som sagt aldrig brugt ShellChangeNotifier. Kan du ikke bare skrive tråden selv ?

Jens B
Avatar billede kennethv Nybegynder
08. september 2005 - 14:59 #9
Aner desværre ikke hvordan man gør.
Avatar billede kennethv Nybegynder
09. september 2005 - 14:42 #10
En anden lille ting Jens B.

kender du til at overfører parameter fra en service via SCM=Service Control Manager?
Avatar billede borrisholt Novice
09. september 2005 - 17:01 #11
Præcis hvad går dit projekt ud på ?

Jens B
Avatar billede kennethv Nybegynder
09. september 2005 - 17:27 #12
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;
Avatar billede kennethv Nybegynder
10. september 2005 - 00:04 #13
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;
Avatar billede kennethv Nybegynder
12. september 2005 - 15:01 #14
Jens B. Kendte du noget til hvordan man overfører parameter fra en service?

/kenneth
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