Avatar billede 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 ?
Avatar billede erikjacobsen Ekspert
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. ;-)
Avatar billede sjensen Nybegynder
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.
Avatar billede 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
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