Avatar billede kennethv Nybegynder
13. maj 2005 - 08:12 Der er 23 kommentarer og
1 løsning

Parameter til en service

Hej gutter!

Jeg sidder og forsøger at få lavet en service sådan at, jeg kan bruge startparameter på serviceen. Jeg har prøvet det her, men jeg for det ikke til at spille.

procedure TService1.ProcessCmdLineParameters;
var Count : Byte;
begin
  for count := 1 to ParamCount do
  begin
    Case ParamStr(Count)[2] Of
      'S','s' : ShellChangeNotifier1.Root := Copy ( ParamStr(Count), 4, Length ( ParamStr(Count)) - 3);
    end;
  end;
end;

Derefter skriver jeg i servicen: /s:c:\\test

Det fungere ikke.

Er der nogen der har nogle ideer?

Note: Jeg skal bruge 2 backslasher (\) da een bliver behandlet som en escape karakter.
Avatar billede martinlind Nybegynder
13. maj 2005 - 18:32 #1
hvad er paramcount ?
skal der ikke mellemrum mellem /S:C...
så det bliver /S :C....
Avatar billede martinlind Nybegynder
13. maj 2005 - 18:33 #2
hvad er paramcount ? = Hvilken værdi har paramcount ?
Avatar billede kennethv Nybegynder
13. maj 2005 - 19:46 #3
ParamCount is the number of parameters for the service. These parameters are typed into the Startup Parameters input window in the Service Control Manager.
Avatar billede kennethv Nybegynder
13. maj 2005 - 19:51 #4
Hov glemte lige at fortælle at grunden til at der ikke skal være mellemrum er at jeg tjekker på nr 2 position og kopier fra position nr 4.
Avatar billede martinlind Nybegynder
14. maj 2005 - 18:51 #5
hvad er problemet så, du svarede ikke på hvilken værdi paramcount har ?
Avatar billede kennethv Nybegynder
15. maj 2005 - 16:01 #6
ParamCount har den værdi, som antal af parameter man har sat på sit program. Man ved ikke hvilken værdi den har på forhånd, da det er forskelligt fra gang til gang. I dette tilfælde er det 1, da jeg kun har sat een parameter på. Hvis jeg havde skrevet /s:bla bla og /p:blabla ville den have 2, osv.

procedure TService1.ProcessCmdLineParameters;
var Count : Byte;
Test : Bolean
begin
  for count := 1 to ParamCount do
  begin
    Case ParamStr(Count)[2] Of
      'S','s' : ShellChangeNotifier1.Root := Copy ( ParamStr(Count), 4, Length ( ParamStr(Count)) - 3);
      'T','t' : Test := true;
    end;
  end;
end;

Jeg kan næsten forstå at du ikke til den? Det er en del af delphi. Prøv F1.
Avatar billede kennethv Nybegynder
15. maj 2005 - 16:03 #7
Hov, selvfølgelig /s:bla bla /t
Avatar billede martinlind Nybegynder
15. maj 2005 - 16:07 #8
Du er sku lidt for tung til at jeg kan hjælpe, nu har jeg to gange prøvet at få at vide hvad værdi den har, har du overhovdet prøvet at lave to min. debug eller har du bare lavet dit program og trykket på run.... det virker ikke jeg må spørge exp.

PS. Ja som numer to på delphi listen kendet jeg godt F1, og jeg kender også funktionen ParamCount
Avatar billede kennethv Nybegynder
15. maj 2005 - 17:20 #9
Jeg ved ikke hvilken værdi den har. Men vi kan da godt sige at den har værdi 1, da jeg kun har en parameter angivet. Hvis jeg kører dette her i et alm prg har jeg ingen problemer. Så jeg er ikke helt sikker på hvad du vil have mig til at sige.
Avatar billede kennethv Nybegynder
15. maj 2005 - 17:28 #10
Dette er et eksempel fra D7.

The following example beeps once for each “beep” passed in on the command line. The example terminates the application if  “exit” is passed in on the command line.

procedure TForm1.FormCreate(Sender: TObject);

var
  i: Integer;
  for i := 1 to ParamCount do
  begin
    if LowerCase(ParamStr(i)) = 'beep' then
      Beep
    else if LowerCase(ParamStr(i)) = 'exit' then
      Application.Terminate;
  end;
end;

Jeg har forsøgt at debugge, men jeg får problemer når jeg gør det. Det har jeg forsøgt at beskrive på dette link. http://www.eksperten.dk/spm/614341
Avatar billede kennethv Nybegynder
16. maj 2005 - 09:26 #11
MartinLind, har du mistet modet? :)  Er der ellers andre der har nogle ideer?

mvh
Avatar billede martinlind Nybegynder
16. maj 2005 - 10:49 #12
hvis du går op i menuen ( run ) er der et punkt der hedder parameters, der skriver du /install så bliver din service installeret, ( så den kan ses i services prg. ) så er debug tricket at skynde sig at vælge run igen og gøre som jeg skrev i det andet spm.

Grunden til jeg gerne vil vide hvad din paramcount er, er jo lidt fordi jeg ikke kan se hvordan du vil køre din service med parametre, da man installere den med parametre og så starter og stopper den via service prg. i control-panelet. Så hvis det SKAL være en service skulle du måske overveje en ini-fil i stedet for paramertre
Avatar billede kennethv Nybegynder
16. maj 2005 - 23:03 #13
Når man nu vælger propeties på servicen har man ikke en mulighed for at sætte nogle parameter på? Det er ihvertfald det jeg synes at det ser ud til at man kan. Mht, til debuging synes jeg ikke at det var det du skrev i mit spørgsmål. http://www.eksperten.dk/spm/614341 Min opfattelse på at debugge udfra det der stod i hjælplen, var at man skulle installere servicen via dosprompt også derfra Attach process, men jeg prøver lige det du nævner.
Avatar billede kennethv Nybegynder
17. maj 2005 - 00:11 #14
Nu har jeg gjort det du nævner, med at skrive /install i parameter og vælge run. Nu er den installeret i service prg. Hvis jeg vælger run igen får jeg en fejl som siger at service er installeret og stopper. Jeg kan ikke vælge en process via attach process. Jeg går udfra at det ikke kan lad sig gøre, fordi at jeg ikke har startet servicen eller skal jeg gøre noget andet?
Avatar billede kennethv Nybegynder
17. maj 2005 - 00:31 #15
Da jeg fjernede /install i parameter og valgte run kører den bare 1 gang hurtigt uden at noget sker. Hvis jeg vælger, via run menuen, attach to process efter at jeg har startet servicen ender jeg i debug CPU. Her vælger jeg run igen, men sker der ikke noget. Det servicen skal er at undersøge om der sker noget i et bestemt bibliotek, såsom en ny fil bliver skabt i den folder. Så hvis jeg opretter en ny fil og sætter et break point, hvor jeg forventer at den skal stoppe sker der ikke noget.
Avatar billede martinlind Nybegynder
17. maj 2005 - 09:30 #16
>>Nu har jeg gjort det du nævner, med at skrive /install i parameter og vælge run. Nu er den installeret i service prg. Hvis jeg vælger run igen får jeg en fejl som siger at service er installeret og stopper. Jeg kan ikke vælge en process via attach process. Jeg går udfra at det ikke kan lad sig gøre, fordi at jeg ikke har startet servicen eller skal jeg gøre noget andet?<< 

Det lyder rigtigt, prøv at lave en start af din service, i service-prg. i controlpanelet, jeg mener det var sådan jeg gjore, har desværre ikke tid til at checke nu
Avatar billede martinlind Nybegynder
17. maj 2005 - 09:32 #17
Mht. til det funktion du vil lave så kan du også vælge at søge på google efter directorywatch eller sådan noget, jeg har set en comp. et eller andet sted der kan
Avatar billede kennethv Nybegynder
17. maj 2005 - 13:11 #18
Jeg har lavet en start af min service inden at jeg via run menuen, attach to process, men jeg ender i debug CPU. Se Kommentar: kennethv
17/05-2005 00:31:18. Det jeg vil have prg til at gøre bruger jeg ShellChangeNotifier kommponent som ligger i sampel. Hvis jeg ikke har nogen OnStart Event på og bare designtime angiver hvilken folder den skal tjekke på har jeg ingen problemer, men det er lige så snart jeg har en startparameter på, hvor jeg skriver en parameter, hvor den skal tjekke for ændringer, fejler den ved at den ikke kan starte servicen.

Nedenfor er det jeg havdet forstillet mig. Bortset fra at der står TService1 ved procedure har jeg tjekket at det virker i et alm prg.

procedure TService1.ProcessCmdLineParameters;
var Count : Byte;
begin
  for count := 1 to ParamCount do
  begin
    Case ParamStr(Count)[2] Of
      'S','s' : ShellChangeNotifier1.Root := Copy ( ParamStr(Count), 4, Length ( ParamStr(Count)) - 3);
    end;
  end;
end;

procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
  ProcessCmdLineParameters;
end;
Avatar billede martinlind Nybegynder
17. maj 2005 - 13:22 #19
Jeg tror det er det med parametre til din service du skal glemme, lav en INI fil der ligger samme sted som din service, og brug den til dinne parametre
Avatar billede kennethv Nybegynder
19. maj 2005 - 23:23 #20
Hej MartinLind.

Jeg har fundet løsningen og den er her:

procedure TService1.ProcessCmdLineParameters;
var Count : Byte;
begin
  For count := 1 to ParamCount-1 do
  Begin
    Case Param[Count][2] Of
//    'S','s' : ShellChangeNotifier1.Root := Copy ( Param[Count], 4, Length ( Param[Count]) - 3);
    'S','s' : ShowMessage(Copy ( Param[Count], 4, Length ( Param[Count]) - 3));
    'P','p' : ShowMessage(Copy ( Param[Count], 4, Length ( Param[Count]) - 3));
    end;
  End;
end;

procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
  ProcessCmdLineParameters;
end;

Det jeg bare ikke fatter er at jeg skal trække 1 fra paramcount, hvis ikke den er på fungere det ikke. ParamCount fortæller, som du nok ved, hvormange parameter der angivet. Og hvis ingen er angivet har den værdi 1, da den ene fortæller hvor servicen er installeret fra og som kaldes med param[0]. Har du nogen ide til hvorfor at jeg skal trække 1 fra paramcount?

Måske har du også en ide til et andet lille problem jeg har. Det har noget med "Default Printer" at gøre, men det er i en anden tråd.

/Kenneth
Avatar billede martinlind Nybegynder
20. maj 2005 - 08:54 #21
det må være noget specielt for en service app, sådan er det ikke med en alm. app.
Avatar billede nop Nybegynder
23. maj 2005 - 14:51 #22
xxx.exe /s

...if paramStr(x)='/s' then root:=copy(paramStr(x),3,100000)
else if paramStr(x)='test:' then .........


derfor skal du trække en fra, / tæller også som tegn.

Har du prøvet debug? Evt det her:
(Ps: parameter sættes i "run/parmaters..." )

for i:=1 to paramCount do begin
  s:=paramStr(i);
  showMesagge(s);
end;
Avatar billede kennethv Nybegynder
23. maj 2005 - 22:00 #23
Jeg ved godt at / også tæller som et tegn, men paramcount siger ikke noget om hvor mange tegn der er i parameteren. Den siger jo bare hvor mange parameter der er. ParamStr(index) for application fortæller hvad der står i index parameter. Param[index] for en service fortæller hvad der står i index parameter.
Avatar billede nop Nybegynder
24. maj 2005 - 07:58 #24
Ja jeg undskylder, jeg læste ikke indad. Det er da lidt interessant at der er forskel på paramCount.
--nop
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