Announcement

Collapse
No announcement yet.

Interbase Guardian

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Interbase Guardian

    Besteht die Möglichkeit den Guardian aus einem Programm heraus zu schließen? (Mit Hilfe einer Befehlszeile)Das bezieht sich auf Windows Systeme.

  • #2
    Hallo,

    ja - über die Win32-API-Funktionen des SCM (Service Control Managers) kann der Dienst programmgesteuert angehalten, gestoppt oder de-installiert werden. Hier im Forum sind einige Beispiele dafür zu finden, wenn nach dem Begriff "<b>OpenSCManager</b>" gesucht wird. Der folgende Auszug demonstriert das Verfahren:
    <pre>
    procedure TForm1.StopService(const sAPC, sService: String);
    var
    hSCM : THandle;
    hSrv : THandle;
    aSrvStatus : TServiceStatus;
    const
    cERR_NO_SCM = 'Kein Zugriff auf SCM!';
    cERR_NO_SRV = 'OpenService für %s ist fehlgeschlagen';
    cERR_RUN = 'Der Dienst »%s« läuft!';
    cERR_STOP = 'Der Dienst »%s« ist gestoppt!';
    cERR_DEL = 'Der Dienst »%s« wurde gelöscht!';
    cERR_DIS = 'Der Dienst »%s« wurde deaktiviert!';
    begin
    hSCM := OpenSCManager(PChar(sAPC), nil, SC_MANAGER_CONNECT);
    try
    if hSCM = 0 then
    raise Exception.Create(cERR_NO_SCM);
    hSrv := OpenService(hSCM, PChar(sService), SC_MANAGER_ALL_ACCESS);
    if hSrv = 0 then
    raise Exception.Create(Format(cERR_NO_SRV, [sService]));
    QueryServiceStatus(hSrv, aSrvStatus);
    if aSrvStatus.dwCurrentState = SERVICE_RUNNING then
    begin
    MemoLog.Lines.Add(Format(cERR_RUN, [sService]));
    ControlService(hSrv, SERVICE_CONTROL_STOP, aSrvStatus);
    Application.ProcessMessages;
    Sleep(500);
    Application.ProcessMessages;
    QueryServiceStatus(hSrv, aSrvStatus);
    if aSrvStatus.dwCurrentState = SERVICE_STOPPED then
    MemoLog.Lines.Add(Format(cERR_STOP, [sService]));
    if CheckBoxDisabled.Checked then
    if ChangeServiceConfig(hSrv, SERVICE_NO_CHANGE, SERVICE_DISABLED,
    SERVICE_NO_CHANGE, nil, nil, nil, nil,
    nil, nil, nil) then
    MemoLog.Lines.Add(Format(cERR_DIS, [sService]));
    if CheckBoxDeleteService.Checked then
    if DeleteService(hSrv) then
    MemoLog.Lines.Add(Format(cERR_DEL, [sService]));

    end
    else
    MemoLog.Lines.Add(Format(cERR_STOP, [sService]));
    CloseServiceHandle(hSrv);
    finally
    CloseServiceHandle(hSCM);
    end;
    end;
    </pre>
    P.S:: Die Delphi-Unit <b>WinSvc</b> muss dazu eingebunden werden

    Comment


    • #3
      Hallo Herr Kosch,
      für die schnelle Hilfe möchte ich mich bedanken

      Comment

      Working...
      X