FAQ DelphiConsultez toutes les FAQ

Nombre d'auteurs : 123, nombre de questions : 920, dernière mise à jour : 8 novembre 2019  Ajouter une question

 

Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums Delphi et Delphi et bases de données de www.developpez.com et de l'expérience personnelle des auteurs.

Nous tenons à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose soient correctes. Les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous souhaitez y apporter des corrections ou la compléter, contactez un responsable (lien au bas de cette page).

Nous espérons que cette FAQ saura répondre à vos attentes. Nous vous en souhaitons une bonne lecture.

L'équipe Delphi de Developpez.com.

Commentez


SommaireSystèmeAdministrationRestauration (3)
précédent sommaire suivant
 

Il est possible de créer des points de restauration du système d'exploitation à partir de Delphi en utilisant le composant TScriptControl gratuitement téléchargeable à http://msdn.microsoft.com/en-us/library/ms950396.aspx

Pour l'utiliser à partir de Delphi, il faut utiliser le menu Composants | Importer un contrôle Active X et installer "Microsoft Script Control 1.0".
Automatiquement, le composant TScriptControl vas être recensé dans la palette ActiveX.

L'utilisation de ce dernier est assez facile comme le montre l'exemple suivant (click sur un bouton, un composant TScriptControl ayant été préalablement déposé sur la fiche)

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.Button1Click(Sender: TObject); 
var 
  sr: OLEVAriant; 
begin 
  ScriptControl1.Language := 'VBScript'; 
  sr := ScriptControl1.Eval('getobject("winmgmts:\\.\root\default:Systemrestore")'); 
  if sr.CreateRestorePoint('Point de restoration crée par programme', 0, 100) = 0 then 
    ShowMessage('Point de restauration correctement créé.') 
  else 
    ShowMessage('Echec à la création d''un point de restauration!'); 
end;

Mis à jour le 14 janvier 2014 Giovanny Temgoua

On utilise l'API SRSetRestorePoint pour créer un point de restauration système mais dans un premier on doit convertir le code C issue du fichier SRRestorePtAPI.h
Nous vous recommandons la lecture des liens cités pour de plus amples informations notamment sur les code d'erreurs possible et les appels imbriqués de point de restauration.

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
program PointRestauration;  
{$APPTYPE CONSOLE}  
  
uses  
  SysUtils,  
  Types;  
  
const  
 CR = #13#10;  
  
  // Type d'événements  
 BEGIN_SYSTEM_CHANGE = 100;  
 END_SYSTEM_CHANGE   = 101;  
  
  // Type de point de restauration  
 APPLICATION_INSTALL =  0;  
 CANCELLED_OPERATION = 13;  
 MAX_DESC = 64;  
 MIN_EVENT = 100;  
  
 // Informations de point de restauration  
type  
 PRESTOREPTINFOA = ^_RESTOREPTINFOA;  
 _RESTOREPTINFOA = packed record  
    dwEventType: DWORD;  // Type d'événements : Begin ou End  
    dwRestorePtType: DWORD;  // Type de point de restauration : Installation d'application / désinstallation  
    llSequenceNumber: INT64;  // Numéro de séquence : 0 pour Begin  
    szDescription: array [0..MAX_DESC] of CHAR; // Description : Nom de l'application / opération  
 end;  
 RESTOREPOINTINFO = _RESTOREPTINFOA;  
 PRESTOREPOINTINFOA = ^_RESTOREPTINFOA;  
  
 // Statut retourné par le système de restauration  
  
 PSMGRSTATUS = ^_SMGRSTATUS;  
 _SMGRSTATUS = packed record  
   nStatus: DWORD; // Statut retourné par le SMP (State Manager Process)  
   llSequenceNumber: INT64;  // Numéro de séquence pour le point de restauration  
 end;  
 STATEMGRSTATUS =  _SMGRSTATUS;  
 PSTATEMGRSTATUS =  ^_SMGRSTATUS;  
  
 function SRSetRestorePointA(pRestorePtSpec: PRESTOREPOINTINFOA; pSMgrStatus: PSTATEMGRSTATUS): Boolean;  
   stdcall; external 'SrClient.dll' Name 'SRSetRestorePointA';
Une fois ceci fait on peut manipuler cette API :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
var  
  InfoPointRestauration : RESTOREPOINTINFO;  
  SMgrStatus: STATEMGRSTATUS;  
  
Function CreateRestorePoint: Boolean;  
// Crée un point de restauration  
begin  
   // Initialise l'enregistrement de type RESTOREPOINTINFO  
   InfoPointRestauration.dwEventType:= BEGIN_SYSTEM_CHANGE;  
  
   // Ici une application est en cours d'installation.  
   InfoPointRestauration.dwRestorePtType:= APPLICATION_INSTALL;  
  
   // Renseigne le numéro de séquence  
   InfoPointRestauration.llSequenceNumber:= 0;  
  
   // Chaîne de description affichée par le système Restore pour ce point de restauration.  
   InfoPointRestauration.szDescription:='Point de restauration Developez';  
  
   // Pour notifier le système que des modifications sont en cours et  
   // que le début du point de restauration peut être marqué.  
   if not SRSetRestorePointA(@InfoPointRestauration, @SMgrStatus) then  
    begin  
      Writeln('Ne peut pas positionner le début du point de restauration.');  
      Result:=False;  
      Exit;  
   end;  
  
   // Ici l'application opère les modifications  
   // ...  
  
   // Ré-initialise l'enregistrement de type RESTOREPOINTINFO pour notifier  
   // le système que l'opération est terminée.  
   InfoPointRestauration.dwEventType:= END_SYSTEM_CHANGE;  
  
   // Termine les modifications système en passant le numéro de séquence  
   // reçu lors du premier appel à l'API SRSetRestorePoint.  
   InfoPointRestauration.llSequenceNumber:= SMgrStatus.llSequenceNumber;  
  
   // Notifie le système que les modifications sont terminée et  
   // que c'est la  fin du point de restauration.  
   if not SRSetRestorePointA(@InfoPointRestauration, @SMgrStatus) then  
   begin  
    Writeln('Ne peut pas positionner la fin du point de restauration.');  
    Result:=False;  
    Exit;  
   end;  
 Result:=True;  
end;
L'appel se faisant simplement par :
Code delphi : Sélectionner tout
1
2
3
4
Begin  
 If CreateRestorePoint  
  then Writeln('Point de restauration créé.');  
end.
Voici une autre méthode qui en cas d'erreur annule le point de restauration nouvellement crée au lieu de le finaliser :
Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Procedure CreateAndCancelRestorePoint;  
// Crée et annule un point de restauration  
 procedure Affiche(Texte:String);  
  begin  
    writeln(Texte+' Données du point de restauration :' + CR+  
     'Numéro de séquence : ' + Format('%d', [SMgrStatus.llSequenceNumber]) + CR+  
     'Statut: ' + Format('%u', [SMgrStatus.nStatus]))  
  end;  
  
begin  
   // Initialise l'enregistrement  
  InfoPointRestauration.dwEventType := BEGIN_SYSTEM_CHANGE;  
  InfoPointRestauration.dwRestorePtType := APPLICATION_INSTALL;  
  InfoPointRestauration.llSequenceNumber := 0;  
  InfoPointRestauration.szDescription := 'Example de point de restauration';  
  
  if (SRSetRestorePointA(@InfoPointRestauration, @SMgrStatus)) then  
   begin  
     Affiche('Configure le point de restauration.');  
       // Configuration pour annuler le point de restauration précédent.  
     InfoPointRestauration.dwEventType := END_SYSTEM_CHANGE;  
     InfoPointRestauration.dwRestorePtType  := CANCELLED_OPERATION;  
     InfoPointRestauration.llSequenceNumber := SMgrStatus.llSequenceNumber;  
  
      // Numéro de séquence retourné par l'appel précédent.  
      // Annule le point de restauration précédent.  
     if (SRSetRestorePointA(@InfoPointRestauration, @SMgrStatus))  
      then Affiche('Point de restauration annulé.')  
      else writeln('Impossible d''annuler le point de restauration.');  
    end  
   else writeln('Impossible de configurer le point de restauration.');  
 Readln;  
end;

Mis à jour le 14 janvier 2014 Laurent Dardenne

Pour lister les points des restaurations, sous Windows XP et Me, il faut obligatoirement utiliser WMI. Vous trouverez dans la liste des liens un tutoriel sur l'utilisation de WMI sous Delphi.

On interroge donc dans l'espace de nom 'ROOT\default' les instances de la classe SystemRestore. Cette interrogation permet également de récupérer le numéro de séquence nécessaire pour supprimer un point de restauration avec l'API SRRemoveRestorePoint.

Code delphi : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
Procedure EnumSR;  
var  
  WMILocator:          TSWbemLocator;  
  WmiService:          SWbemServices;  
  
  WmiObject:           SWbemObject;  
  wmiObjectSet:        SWbemObjectSet;  
  
  WmiProperty:         SWbemProperty;  
  WmiPropertySet:      SWbemPropertySet;  
  WmiDateTime   :      TSWbemDateTime;  
  
  PropertyEnumerator,  
  ObjectEnumerator:    IEnumVariant;  
  ArrayVariant:        OleVariant;  // Tableau de variant  
  NumberItem:          LongWord;  
  
  CreationTime : String;  
  
begin  
  WMILocator:= TSWbemLocator.Create(Nil);  
  WmiDateTime:= TSWbemDateTime.Create(Nil);  
 try  
   // Création d'une connexion à un espace de nom local  
   // ici le nom de l'espace de nom cible est : CIMV2  
   // L'appel renvoie un objet SWbemServices  
   WmiService:= WMILocator.ConnectServer('.', 'ROOT\default', '', '', '',  
                                         '', wbemConnectFlagUseMaxWait, nil);  
  
  
   // Retrouve la collection d'instance de la classe SystemRestore  
   // de l'espace de nom courant  
    wmiObjectSet := wmiService.InstancesOf('systemrestore',  
                                             wbemFlagReturnWhenComplete+wbemQueryFlagShallow,  
                                             nil);  
  
    // Affecte un énumérateur pour la collection d'objet SWbemObject  
  ObjectEnumerator:= (WmiObjectSet._NewEnum) as IEnumVariant;  
  
    // Retourne NumberItem éléments dans le tableau ArrayVariant,  
    // ici 1 élément est demandé  
  while (ObjectEnumerator.Next(1, ArrayVariant, NumberItem) = S_OK) do  
  begin  
      // Récupére de la collection l'objet SWbemObject courant  
   WmiObject := IUnknown(ArrayVariant) as SWBemObject;  
  
      // Retrouve la collection d'objet WmiProperty contenant toutes les propriétés  
   WmiPropertySet:= WmiObject.Properties_;  
      // Affecte un énumérateur pour la collection d'objet WmiProperty  
   PropertyEnumerator:= (WmiPropertySet._NewEnum) as IEnumVariant;  
  
     // Après l'affectation précédente, on peut réutiliser la variable ArrayVariant  
   while (PropertyEnumerator.Next(1, ArrayVariant, NumberItem) = S_OK) do  
   begin  
     // Récupére de la collection l'objet SWBemProperty courant  
    WmiProperty := IUnknown(ArrayVariant) as SWBemProperty;  
  
       // Retrouve le nom du service via la propriété de classe nommé 'Name'.  
       // Implicite : propriété de type Chaine de caractère.  
       //   WmiProperty.CIMType = wbemCimtypeString  
   If WmiProperty.name='CreationTime'  
     then  
       With WmiDateTime do  
       begin  
          // Format de date CIM_DATETIME (UTC)  
         CreationTime:=WmiProperty.Get_Value;  
         UTCSpecified:=True;  
         Year:=StrToInt(Copy(CreationTime,1,4));  
         Month:=StrToInt(Copy(CreationTime,5,2));  
         Day:=StrToInt(Copy(CreationTime,7,2));  
         Hours:=StrToInt(Copy(CreationTime,9,2));  
         Minutes:=StrToInt(Copy(CreationTime,11,2));  
         Seconds:=StrToInt(Copy(CreationTime,13,2));  
         Microseconds:=StrToInt(Copy(CreationTime,16,6));  
         Utc:=StrToInt(Copy(CreationTime,22,4));  
             // Format de date DATETIME  
         Write('Date : ',DateTimeToStr(GetVarDate(True)));  
       end;  
    If WmiProperty.name='Description'  
     then Write(' Description : ',WmiProperty.Get_Value);  
    If WmiProperty.name='SequenceNumber'  
     then Writeln(' Numéro de séquence: ',WmiProperty.Get_Value)  
   end;  
  end;  
 Readln;  
 Finally  
  WmiDateTime.Free;  
  WMILocator.Free;  
 end;  
end;
L'exécution de cette méthode, dans une application console, doit être imbriqué dans les appels d'initialisation de COM :
Code delphi : Sélectionner tout
1
2
3
4
5
begin  
 CoInitialize(Nil);  
  EnumSR;  
 CoUnInitialize;  
end.
Note : Il est possible d'avoir la liste des points de restauration, leur numéro et leur description au format texte en utilisant l'outil : C:\WINDOWS\system32\Restore\srdiag.exe (c: étant la racine de la partition où votre Windows est installé).
Consultez, pour récupérer ces informations, le fichier sr-rp.log dans le fichier CAB généré.

Mis à jour le 14 janvier 2014 Laurent Dardenne

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2019 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.