Démarrer un service via Shellexecute

PhilLU
Messages postés
251
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
11 mai 2021
- 24 juil. 2013 à 20:46
sp40
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
- 30 juil. 2013 à 11:27
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

PhilLU
Messages postés
251
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
11 mai 2021

24 juil. 2013 à 21:00
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 :-(
0
korgis
Messages postés
420
Date d'inscription
samedi 17 mai 2003
Statut
Membre
Dernière intervention
6 mai 2019
16
25 juil. 2013 à 11:31
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;
0
cirec
Messages postés
3832
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
17 février 2022
48
25 juil. 2013 à 12:29
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]
0
PhilLU
Messages postés
251
Date d'inscription
lundi 9 novembre 2009
Statut
Membre
Dernière intervention
11 mai 2021

25 juil. 2013 à 16:23
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;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sp40
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
30 juil. 2013 à 11:27
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.

0