13. maj 2005 - 08:12Der 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.
ParamCount is the number of parameters for the service. These parameters are typed into the Startup Parameters input window in the Service Control Manager.
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.
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
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.
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
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
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.
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?
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.
>>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
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
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;
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
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.
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.
Ja jeg undskylder, jeg læste ikke indad. Det er da lidt interessant at der er forskel på paramCount. --nop
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.