Slettet bruger
13. marts 2000 - 08:24
Der er
2 kommentarer og
1 løsning
Hvordan kan man..
..lave et Delphi program der kan starte og stoppe en service, der i dette tilfælde kører under NT.
Jeg ville gerne kunne stoppe en service og ændre nogle af de betingelser servicen arbejder under og så starte den igen.
OG hvorfor fan... kan jeg kun vælge mellem at give 15, 30 eller 60 point for et svar ??? Jeg vil gerne give 100 for et godt svar og 100-200 mere for en svar med en source der bare virker, men det kan jeg ikke få lov til. Hvorfor det ? Jeg kan se at der er andre der giver mange flere point for et godt svar. Hvordan gør I det ?
13. marts 2000 - 08:57
#1
De sætter kryds ud for det blanke felt under
de 15, 30 og 60, og skriver et tal mellem 0
og 2000. ;-)
13. marts 2000 - 09:30
#2
kiss>for at lave et delphi program til at starte og stoppe en service skal man bruge API-kald. Der er ikke noget direkte i Delphi til dette, men det er ikke så svært endda. Man skal selvfølgeligt lige vide hvordan og det er det der er det svære.
Nedenstående pas-filen for et servicekontrolprogram jeg har lavet, og ud over at starte og stoppe servicen kan det også Pause og Continue den.
Derudover har jeg i mit program også mulighed for at ændre på nogle registry indstillinger servicen bruger og når den starter læser den disse indstillinger. Jeg har også selv lavet servicen og ved derfor hvilke registry indstillinger den bruger.
Hvad mener du med "..betingelser servicen arbejder under.." ? Hvis det er registry indstillinger som for mit program så kan dette hjælpe dig, og hvis det er de parametre man kan sætte i NT's service oversigt i kontrol panelet, så skal du bruge variablen ARGV der er et parameter til StartService.
Jeg kunne evt. sende dig hele molevitten hvis du vil, men her er i hvert fald programmet. Hvis du vil have formen også så sig lige til:
unit Control;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ComCtrls, StdCtrls, WinSvc, Menus, Buttons, ExtCtrls;
type
TDG5SrvC = class(TForm)
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
cmdStart: TButton;
cmdPause: TButton;
cmdStop: TButton;
cmdContinue: TButton;
stalab: TLabel;
stolab: TLabel;
paulab: TLabel;
conlab: TLabel;
GroupBox2: TGroupBox;
CmdSetup: TBitBtn;
MainMenu1: TMainMenu;
File1: TMenuItem;
Edit1: TMenuItem;
Control1: TMenuItem;
Help1: TMenuItem;
About1: TMenuItem;
Exit1: TMenuItem;
Settings1: TMenuItem;
N1Start: TMenuItem;
N2Stop: TMenuItem;
N3Pause: TMenuItem;
N4Continue: TMenuItem;
GetVers1: TGetVersionInfoFromFile;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure cmdStopClick(Sender: TObject);
procedure cmdStartClick(Sender: TObject);
procedure cmdPauseClick(Sender: TObject);
procedure cmdContinueClick(Sender: TObject);
procedure eXit1Click(Sender: TObject);
procedure N1StartClick(Sender: TObject);
procedure N2StopClick(Sender: TObject);
procedure N3PauseClick(Sender: TObject);
procedure N4ContinueClick(Sender: TObject);
procedure About1Click(Sender: TObject);
procedure CmdSetupClick(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
schService : SC_HANDLE;
schSCManager: SC_HANDLE;
ssStatus : TServiceStatus;
procedure check_status;
procedure Clear_Captions;
public
{ Public declarations }
end;
var
DG5SrvC: TDG5SrvC;
service_installed : Boolean;
implementation
{$R *.DFM}
procedure TDG5SrvC.check_status;
begin
cmdstart.Enabled := False;
cmdstop.Enabled := False;
cmdPause.Enabled := False;
cmdContinue.Enabled := False;
if not service_installed then
begin
label2.Caption := 'Service Not Installed !';
Exit;
end;
if queryservicestatus(schService, ssStatus) then
begin
case ssStatus.dwCurrentState of
SERVICE_STOPPED : begin //The service is not running.
label2.Caption := 'Service Stopped !';
cmdStart.Enabled := True;
cmdstop.Enabled := False;
cmdPause.Enabled := False;
cmdContinue.Enabled := False;
end;
SERVICE_RUNNING : begin //The service is running.
label2.Caption := 'Service Started !';
cmdStart.Enabled := False;
cmdstop.Enabled := True;
cmdPause.Enabled := True;
cmdContinue.Enabled := False;
end;
SERVICE_PAUSED : begin //The service is paused.
label2.Caption := 'Service Paused !';
cmdStart.Enabled := False;
cmdstop.Enabled := False;
cmdPause.Enabled := False;
cmdContinue.Enabled := True;
end;
end;
end;
end;
procedure TDG5SrvC.FormCreate(Sender: TObject);
begin
// Read_Create_Registry_Entries;
end;
procedure TDG5SrvC.FormShow(Sender: TObject);
var ServiceName : string;
begin
cmdstart.Enabled := False;
cmdstop.Enabled := False;
cmdPause.Enabled := False;
cmdContinue.Enabled := False;
service_installed := False;
ServiceName := 'dg5arpprt';
schSCManager:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
if (schSCManager>0) then
begin
service_installed := True;
end;
if service_installed then
begin
schService:=OpenService(schSCManager,PChar(ServiceName),SERVICE_ALL_ACCESS);
if (schService<=0) then
begin
service_installed := False;
end;
end;
check_status; // check and report status
end;
procedure TDG5SrvC.FormClose(Sender: TObject; var Action: TCloseAction);
begin
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
end;
procedure TDG5SrvC.cmdStopClick(Sender: TObject);
begin
if ControlService(schService,SERVICE_CONTROL_STOP,ssStatus) then
begin
stolab.caption:='Stopping Service Now ';
Application.ProcessMessages;
Sleep(1000);
while (QueryServiceStatus(schService,ssStatus)) do
begin
Application.ProcessMessages;
if ssStatus.dwCurrentState=SERVICE_STOP_PENDING then
begin
stolab.caption:=stolab.caption+('.');
Application.ProcessMessages;
Sleep(1000);
end else
begin
break;
end;
end;
if ssStatus.dwCurrentState=SERVICE_STOPPED then
begin
stolab.caption:='Service Stopped Ok';
end else
begin
stolab.caption:='Service Stop Fail';
end;
end else
begin
stolab.caption:='Service Stop Fail';
end;
check_status; // check and report status
end;
procedure TDG5SrvC.cmdStartClick(Sender: TObject);
var
Argv:PChar;
begin
if StartService(schService,0,Argv) then
begin
stalab.caption:='Start Service Now ';
Application.ProcessMessages;
Sleep(1000);
while (QueryServiceStatus(schService,ssStatus)) do
begin
Application.ProcessMessages;
if ssStatus.dwCurrentState=SERVICE_START_PENDING then
begin
stalab.caption:=stalab.caption+('.');
Application.ProcessMessages;
Sleep(1000);
end else
begin
break;
end;
end;
if ssStatus.dwCurrentState=SERVICE_RUNNING then
begin
stalab.caption:='Service Started Ok';
end else
begin
stalab.caption:='Service Start Fail';
end;
end else
begin
stalab.caption:='Service Start Fail';
end;
check_status; // check and report status
end;
procedure TDG5SrvC.cmdPauseClick(Sender: TObject);
begin
if ControlService(schService,SERVICE_CONTROL_PAUSE,ssStatus) then
begin
paulab.caption:='Pausing Service Now ';
Application.ProcessMessages;
Sleep(1000);
while (QueryServiceStatus(schService,ssStatus)) do
begin
Application.ProcessMessages;
if ssStatus.dwCurrentState=SERVICE_PAUSE_PENDING then
begin
paulab.caption:=paulab.caption+('.');
Application.ProcessMessages;
Sleep(1000);
end else
begin
break;
end;
end;
if ssStatus.dwCurrentState=SERVICE_PAUSED then
begin
paulab.caption:='Service Paused Ok';
end else
begin
paulab.caption:='Service Pause Fail';
end;
end else
begin
paulab.caption:='Service Pause Fail';
end;
check_status; // check and report status
end;
procedure TDG5SrvC.cmdContinueClick(Sender: TObject);
begin
Clear_Captions;
if ControlService(schService,SERVICE_CONTROL_CONTINUE,ssStatus) then
begin
conlab.caption:='Continuing Service Now ';
Application.ProcessMessages;
Sleep(1000);
while (QueryServiceStatus(schService,ssStatus)) do
begin
Application.ProcessMessages;
if ssStatus.dwCurrentState=SERVICE_CONTINUE_PENDING then
begin
conlab.caption:=conlab.caption+('.');
Application.ProcessMessages;
Sleep(1000);
end else
begin
break;
end;
end;
if ssStatus.dwCurrentState=SERVICE_RUNNING then
begin
conlab.caption:='Service Continued Ok';
end else
begin
conlab.caption:='Service Continue Fail';
end;
end else
begin
conlab.caption:='Service Continue Fail';
end;
check_status; // check and report status
end;
end.
Der er måske meget mere end du skal bruge men jeg håber at du kan finde ud af det alligevel. Se under Formshow for at se hvordan man starter og under de 4 punkter start, stop, pause og continue for hvordan amn gør det. proceduren Check-Status er blot for at vise hvad status er og den kaldes efter hver funktion.
Vedr. point: Som erikjacobsen siger er det bare at skrive et nyt tal i det tomme felt.
Slettet bruger
13. marts 2000 - 14:42
#3
Tak sjensen ! Du er bare nuser ;-)Det var lige det jeg manglede.
OpenSCManager og OpenService kunne jeg ikke finde ud af og at se hvordan du har gjort med queryservicestatus i din check-status procedure har hjulpet meget.
Det jeg mente med at kunne ændre betingelserne for servicen var at kunne ændre parametrene så tak for den oplysning også. Du får 200 point mere når jeg har fundet ud af hvordan jeg kan give dig dem.
og tilbåde dig og erikjacobsen vedr. point tildeling: Ja, ja, det er godt med jer begge to. Da jeg oprettede spørgsmålet var der 3 bokse jeg kunne sætte et hak i: et ud for 15 point, et ud for 30 og et ud for 60 point. Der var ingen boks eller noget tomt felt jeg kunne skrive et andet tal i. Men jeg opretter lige et spm. til sjensen og så kan jeg jo prøve igen.
tak til begge