Windows - como criar um ponto de restauracao (restore point)

Top  Previous  Next

The following example demonstrates how to create and cancel restore points. 

Answer:

 

 

To create a new System Restore Point in Windows XP, click Start -> All Programs -> 

Accessories -> System Tools -> System Restore. 

 

The following two examples show two ways how to do this with Delphi. 

 

 

{*****************************************************} 

{1. Using the Microsoft Scripting Control} 

 

  

  If you haven't installed the Microsoft Scripting Control yet 

  (TScriptControl component), get it 

  from http://www.msdn.microsoft.com/scripting/ 

 

  Once you've downloaded and run the installation, start Delphi and go to the 

  Component | Import ActiveX Control... menu. 

  Select "Microsoft Script Control 1.0" from the Listbox amd click "Install" 

  to install the component into Delphi's palette. 

  What you should end up with now is a TScriptControl component on your ActiveX tab. 

  Start a new application, and drop a TButton, and a TScriptControl onto the main form. 

  In the OnClick event of Button1, put the following code: 

  } 

 

procedure TForm1.Button1Click(Sender: TObject); 

var 

  sr: OLEVAriant; 

begin 

  ScriptControl1.Language := 'VBScript'

  sr := ScriptControl1.Eval('getobject("winmgmts:\\.\root\default:Systemrestore")'); 

  if sr.CreateRestorePoint('Automatic Restore Point'0100) = 0 then 

    ShowMessage('New Restore Point successfully created.'

  else 

    ShowMessage('Restore Point creation Failed!'); 

end

 

{*****************************************************} 

{2. Using the SRSetRestorePoint() API from SrClient.dll} 

 

// Translation from SRRestorePtAPI.h 

const 

 // Type of Event 

 BEGIN_SYSTEM_CHANGE = 100

 END_SYSTEM_CHANGE  = 101

 // Type of Restore Points 

 APPLICATION_INSTALL =  0

 CANCELLED_OPERATION = 13

 MAX_DESC = 64

 MIN_EVENT = 100

 

// Restore point information 

type 

PRESTOREPTINFOA = ^_RESTOREPTINFOA; 

_RESTOREPTINFOA = packed record 

    dwEventType: DWORD;  // Type of Event - Begin or End 

    dwRestorePtType: DWORD;  // Type of Restore Point - App install/uninstall 

    llSequenceNumber: INT64;  // Sequence Number - 0 for begin 

    szDescription: array [0..MAX_DESCof CHAR; // Description - Name of Application / Operation 

end

RESTOREPOINTINFO = _RESTOREPTINFOA; 

PRESTOREPOINTINFOA = ^_RESTOREPTINFOA; 

 

// Status returned by System Restore 

 

PSMGRSTATUS = ^_SMGRSTATUS; 

_SMGRSTATUS = packed record 

    nStatus: DWORD; // Status returned by State Manager Process 

    llSequenceNumber: INT64;  // Sequence Number for the restore point 

end

STATEMGRSTATUS =  _SMGRSTATUS; 

PSTATEMGRSTATUS =  ^_SMGRSTATUS; 

 

function SRSetRestorePointA(pRestorePtSpec: PRESTOREPOINTINFOA; pSMgrStatus: PSTATEMGRSTATUS): Bool; 

  stdcall; external 'SrClient.dll' Name 'SRSetRestorePointA'

 

// Example how to create and cancel a previous restore point. 

// Ref: http://tinyurl.com/78pv 

 

procedure TForm1.Button1Click(Sender: TObject); 

const 

 CR = #13#10

var 

  RestorePtSpec: RESTOREPOINTINFO; 

  SMgrStatus: STATEMGRSTATUS; 

begin 

  // Initialize the RESTOREPOINTINFO structure 

  RestorePtSpec.dwEventType := BEGIN_SYSTEM_CHANGE; 

  RestorePtSpec.dwRestorePtType := APPLICATION_INSTALL; 

  RestorePtSpec.llSequenceNumber := 0

  RestorePtSpec.szDescription := 'SAMPLE RESTORE POINT'

 

  if (SRSetRestorePointA(@RestorePtSpec, @SMgrStatus)) then 

  begin 

    ShowMessage('Restore point set. Restore point data:' + CR+ 

      'Sequence Number: ' + Format('%d', [SMgrStatus.llSequenceNumber]) + CR+ 

      'Status: ' + Format('%u', [SMgrStatus.nStatus])); 

 

      // Restore Point Spec to cancel the previous restore point. 

      RestorePtSpec.dwEventType := END_SYSTEM_CHANGE; 

      RestorePtSpec.dwRestorePtType  := CANCELLED_OPERATION; 

      RestorePtSpec.llSequenceNumber := SMgrStatus.llSequenceNumber; 

 

      // This is the sequence number returned by the previous call. 

      // Canceling the previous restore point 

      if (SRSetRestorePointA(@RestorePtSpec, @SMgrStatus)) then 

        ShowMessage('Restore point canceled. Restore point data:' + CR+ 

        'Sequence Number: ' + Format('%d', [SMgrStatus.llSequenceNumber]) + CR+ 

        'Status: ' + Format('%u', [SMgrStatus.nStatus])) 

 

      else 

        ShowMessage('Couldn''t cancel restore point.'); 

    end 

    else 

      ShowMessage('Couldn''set restore point.'); 

  end; 

end;