Einzelnen Beitrag anzeigen

norbertd

Registriert seit: 5. Mai 2006
5 Beiträge
 
#3

Re: Drucker Warteschlange leeren?

  Alt 5. Mai 2006, 23:44
Hiermit geht es:

Delphi-Quellcode:
// start service
//
// return TRUE if successful
//
// sMachine:
// machine name, ie: \\SERVER
// empty = local machine
//
// sService
// service name, ie: spooler
//
function TPPInstallForm.ServiceStart(sMachine, sService : string ) : boolean;
  var
    schm, schs : SC_Handle; // service control manager handle & service handle
    ss : TServiceStatus; // service status
    psTemp : PChar; // temp char pointer
    dwChkP : DWord; // check point
  begin
    ss.dwCurrentState := 0;
    // connect to the service control manager
    schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT);
    // if successful...
    if(schm > 0)then begin
      // open a handle to the specified service
      // we want to start the service and query service status
      schs := OpenService(schm, PChar(sService), SERVICE_START or SERVICE_QUERY_STATUS);
      // if successful...
      if(schs > 0)then begin
        psTemp := Nil;
        if(StartService(schs, 0, psTemp)) then begin
          // check status
          if (QueryServiceStatus(schs, ss))then begin
            while (SERVICE_RUNNING <> ss.dwCurrentState)do begin
              //
              // dwCheckPoint contains a value that the service increments periodically
              // to report its progress during a lengthy operation.
              // save current value
              dwChkP := ss.dwCheckPoint;
              // wait a bit before checking status again
              //
              // dwWaitHint is the estimated amount of time
              // the calling program should wait before calling
              // QueryServiceStatus() again
              //
              // idle events should be
              // handled here...
              //
              Sleep(ss.dwWaitHint);
              if (not QueryServiceStatus(schs, ss))then begin
                // couldn't check status
                // break from the loop
                break;
              end;
              if (ss.dwCheckPoint < dwChkP) then begin
                // QueryServiceStatus didn't increment dwCheckPoint as it should have.
                // avoid an infinite loop by breaking
                break;
              end;
            end;
          end;
        end;
        // close service handle
        CloseServiceHandle(schs);
      end;
      // close service control manager handle
      CloseServiceHandle(schm);
  end;
  // return TRUE if the service status is running
  Result := SERVICE_RUNNING = ss.dwCurrentState;
end;

//------------------------------------------------------------------------------
// stop service
//
// return TRUE if successful
//
// sMachine:
// machine name, ie: \\SERVER
// empty = local machine
//
// sService
// service name, ie: Alerter
//
function TPPInstallForm.ServiceStop(sMachine, sService : string ) : boolean;
  var
    schm, schs : SC_Handle; // service control & service handle manager handle
    ss : TServiceStatus; // service status
    dwChkP : DWord; // check point
  begin
    // connect to the service control manager
    schm := OpenSCManager(PChar(sMachine), Nil, SC_MANAGER_CONNECT);
    // if successful...
    if (schm > 0) then begin
      // open a handle to the specified service
      // we want to stop the service and query service status
      schs := OpenService(schm, PChar(sService), SERVICE_STOP or SERVICE_QUERY_STATUS);
      // if successful...
      if (schs > 0) then begin
        if (ControlService(schs, SERVICE_CONTROL_STOP, ss)) then begin
          // check status
          if (QueryServiceStatus(schs, ss)) then begin
            while (SERVICE_STOPPED <> ss.dwCurrentState) do begin
              // dwCheckPoint contains a value that the service increments periodically
              // to report its progress during a lengthy operation.
              // save current value
              dwChkP := ss.dwCheckPoint;
              // wait a bit before checking status again
              // dwWaitHint is the estimated amount of time
              // the calling program should wait before calling QueryServiceStatus() again
              // idle events should be handled here...
              Sleep(ss.dwWaitHint);
              if (not QueryServiceStatus(schs, ss)) then begin
                // couldn't check status
                // break from the loop
                break;
              end;
              if (ss.dwCheckPoint < dwChkP) then begin
                // QueryServiceStatus didn't increment dwCheckPoint as it should have.
                // avoid an infinite loop by breaking
                break;
              end;
            end;
          end;
        end;
        // close service handle
        CloseServiceHandle(schs);
      end;
      // close service control manager handle
      CloseServiceHandle(schm);
    end;
    // return TRUE if the service status is stopped
    Result := SERVICE_STOPPED = ss.dwCurrentState;
end;
...und hier die Einleitung für den eigentlichen Code:

Delphi-Quellcode:
      if (ServiceStop('', 'spooler')) then
         begin

      //Hier Deinen Code einfügen..............

      if not ServiceStart('', 'spooler') then
         ShowMessage('Der Spoolservice konnte nicht gestartet werden.' + #13 + 'Bitte den Treiber deinstallieren und wiederholen.')
[edit=Luckie]Delphi-Tags hinzugefügt. Mfg, Luckie[/edit]
  Mit Zitat antworten Zitat