FAQ DelphiConsultez toutes les FAQ
Nombre d'auteurs : 124, nombre de questions : 934, dernière mise à jour : 23 octobre 2024 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.
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; |
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'; |
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; |
Code delphi : | Sélectionner tout |
1 2 3 4 | Begin If CreateRestorePoint then Writeln('Point de restauration créé.'); end. |
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; |
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; |
Code delphi : | Sélectionner tout |
1 2 3 4 5 | begin CoInitialize(Nil); EnumSR; CoUnInitialize; end. |
Consultez, pour récupérer ces informations, le fichier sr-rp.log dans le fichier CAB généré.
Lien MSDN : classe WMI SystemRestore
Comment manipuler une date WMI au format String ?
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 çaLes 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 © 2024 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.