Démarrer un service via Shellexecute

Signaler
Messages postés
250
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
4 septembre 2020
-
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
-
Bonsoir,
Je cherche à démarrer un service (coucou) déjà installé à l'aide de Shellexecute.
Voici mon code mais j'obtiens une erreur (E2010 types incompatibles: PWideChar et string ):

unit Unit1;
interface
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, shellapi, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure start_service (var service : PWideChar) ;
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;
var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure start_service (var service : PWideChar);
begin
ShellExecute(0, nil, 'cmd.exe', 'sc config' + service +' start=enabled', nil, SW_HIDE);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
start_service('coucou');
end;
end.


J'ai déjà testé plusieurs versions sans meilleur résultat :-(

Qui peux m'aider?
Merci d'avance

5 réponses

Messages postés
250
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
4 septembre 2020

J'ai aussi testé ça:
ShellExecute(0,'NET','START coucou',nil,nil,SW_HIDE);

Pas d'erreur cette fois mais le service ne démarre pas :-(
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
15
Salut,

Peut-être comme ça ?

procedure start_service (var service : PWideChar);
begin
  ShellExecute(0, nil, 'cmd.exe', PChar('sc config "' + service + '" start=disabled'), nil, SW_HIDE);
end;
Messages postés
3816
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
5 septembre 2020
34
Salut,

pourquoi avoir mis PWideChar ???

Remplaces les par string et ton erreur devrait disparaitre.


Sinon on ne devrait plus utiliser "ShellExecute" dans les applications .... pour un teste rapide ou un petit code d'exemple ... éventuellement mais tu devrait utiliser "CreateProcess" à la place.

Et pour finir j'attends toujours encore l'upload du fameux fichier texte sur dl.free.fr


[hr]@+Cirec
[hr]
Messages postés
250
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
4 septembre 2020

Finalement j'utilise ceci:
function ServiceStart(sMachine,sService : string ) : boolean;
var
  schm,schs   : SC_Handle;
  ss     : TServiceStatus;
  psTemp : PChar;
  dwChkP : DWord;
begin
  ss.dwCurrentState := 0;
  schm := OpenSCManager(PChar(sMachine),Nil,SC_MANAGER_CONNECT);
  if(schm > 0)then
  begin
    schs := OpenService(schm,PChar(sService),SERVICE_START or SERVICE_QUERY_STATUS);
    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
            dwChkP := ss.dwCheckPoint;
            Sleep(ss.dwWaitHint);
            if(not QueryServiceStatus(schs,ss))then
            begin
            break;
            end;
            if(ss.dwCheckPoint <
              dwChkP)then
            begin
              break;
            end;
          end;
        end;
      end;
      CloseServiceHandle(schs);
    end;
    CloseServiceHandle(schm);
  end;
  Result :SERVICE_RUNNING ss.dwCurrentState;
end;


et pour récupérer le nom de la machine:

var
lpBuffer: array[0..MAX_COMPUTERNAME_LENGTH] of char;
nSize: dword;
begin
    nSize:= Length(lpBuffer);
  GetComputerName(lpBuffer, nSize);
end;
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
Il me semble que cette source est sur le site... (Je l'avais récupérée, mais je ne sais plus où...). Attention, je crois bien qu'il te faut une élévation de privilège (w7) en exécution, et ouvrir Delphi en administrateur pour le debug....

{
  *----------------------------------------------*
    Utilisation de la librairie WinSVC
    et des services Windows.
 *----------------------------------------------*

}

unit UServicesNT;

{.DATA}
interface

uses Windows, WinSVC;

   function ServiceCreate(SrvName : string; Libelle : string; Chemin : string; Machine : string = '') : Boolean;
   function ServiceOpen(SrvName : string; Machine : string = '') : Cardinal;
   function ServiceRemove(SrvName : string; Machine : string = '') : Boolean;
   function ServiceStart (SrvName : string; Machine : string = '') : Boolean;
   function ServiceStop  (SrvName : string; Machine : string = '') : Boolean;
   function ServiceState(SrvName : string; out oiState : Cardinal; Machine : string = '') : string;

{.CODE}
implementation


{ Ouvre un service }
function ServiceOpen(SrvName : string; Machine : string = '') : Cardinal;
var
   H_SC : SC_Handle;
begin
     if (Machine = '')
        then H_SC := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS)
     else H_SC := OpenSCManager(PChar(Machine), nil, SC_MANAGER_ALL_ACCESS);

     if (SrvName = '')
        then result := H_SC
     else Result := OpenService(H_SC, PChar(SrvName), SC_MANAGER_ALL_ACCESS);
end;


{ Créé un service }
function ServiceCreate(SrvName : string; Libelle : string; Chemin : string; Machine : string = '') : Boolean;
var
   H_SC : SC_Handle;
   H_Sr : SC_Handle;
begin
     Result := False;

     H_SC := ServiceOpen( '', Machine);

     if (H_SC > 0) then begin
        H_Sr := CreateService( H_SC,
                              PChar( SrvName ),
                              PChar( Libelle ),
                              SC_MANAGER_ALL_ACCESS,
                              SERVICE_WIN32_OWN_PROCESS,
                              SERVICE_AUTO_START,
                              SERVICE_ERROR_IGNORE,
                              PChar( Chemin ),
                              nil,
                              nil,
                              nil,
                              nil,
                              nil );
        Result := (H_Sr > 0);
        CloseServiceHandle(H_Sr);
        CloseServiceHandle(H_SC);
     end;
end;



{ Supprime un service }
function ServiceRemove(SrvName : string; Machine : string = '') : Boolean;
var
   SrvHandle : Cardinal;
begin
     Result := False;
     SrvHandle := ServiceOpen(SrvName, Machine);
     try
        Result := DeleteService(SrvHandle);
     finally
            CloseServiceHandle(SrvHandle);
     end;
end;



{ Démarre un service }
function ServiceStart(SrvName : string; Machine : string = '') : Boolean;
var
   SrvHandle : Cardinal;
   ServiceArgVectors : PAnsiChar;
   SrvState  : _SERVICE_STATUS;
begin
     Result := False;
     ServiceArgVectors := nil;
     SrvHandle := ServiceOpen(SrvName, Machine);
     try
        Result := (StartService(SrvHandle, 0, PWideChar(ServiceArgVectors)));
     finally
            CloseServiceHandle(SrvHandle);
     end;
end;



{ Arrête un service }
function ServiceStop(SrvName : string; Machine : string = '') : Boolean;
var
   SrvHandle : Cardinal;
   ServiceArgVectors : PAnsiChar;
   SrvState  : _SERVICE_STATUS;
begin
     Result := False;
     ServiceArgVectors := nil;
     SrvHandle := ServiceOpen(SrvName, Machine);
     try
        Result := ControlService(SrvHandle, SERVICE_CONTROL_STOP, SrvState);
       (*
           Si çà vous interesse, les différents autres status sont :
           - SERVICE_CONTROL_STOP
           - SERVICE_CONTROL_PAUSE
           - SERVICE_CONTROL_CONTINUE
           - SERVICE_CONTROL_INTERROGATE
           - SERVICE_CONTROL_SHUTDOWN
       *)
     finally
            CloseServiceHandle(SrvHandle);
     end;
end;



{ Renvoi l'etat actuel du service }
function ServiceState(SrvName : string; out oiState : Cardinal; Machine : string = '') : string;
var
   SrvHandle : Cardinal;
   SrvState  : _SERVICE_STATUS;
begin
     SrvHandle := ServiceOpen(SrvName, Machine);
     try
        if not (QueryServiceStatus(SrvHandle, SrvState)) then begin
           oiState := 0;
           Result  := 'Inexistant';
        end
        else begin
             oiState := SrvState.dwCurrentState;
             case oiState of
                  SERVICE_CONTINUE_PENDING : Result := 'Relancé après une opération continue';
                  SERVICE_PAUSE_PENDING    : Result := 'Relancé après une opération pause';
                  SERVICE_PAUSED           : Result := 'Pause';
                  SERVICE_RUNNING          : Result := 'Démarré';
                  SERVICE_START_PENDING    : Result := 'Démarrage';
                  SERVICE_STOP_PENDING     : Result := 'Arrêt';
                  SERVICE_STOPPED          : Result := 'Arrêté';
                  else Result := 'Etat du service inconnu ou service inexistant !';
             end;
        end;
     finally
            CloseServiceHandle( SrvHandle );
     end;
end;

end.