AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Volume Shadow Copy Service nutzen
Thema durchsuchen
Ansicht
Themen-Optionen

Volume Shadow Copy Service nutzen

Offene Frage von "HeikoAdams"
Ein Thema von HeikoAdams · begonnen am 15. Feb 2010 · letzter Beitrag vom 22. Feb 2010
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#1

Volume Shadow Copy Service nutzen

  Alt 15. Feb 2010, 08:10
Hallo,
gibt es hier jemanden, der den Volume Shadow Copy Service mit Delphi nutzt?
Die übersetzten Header-Dateien, die das Delphi Magazine veröffentlicht[1] hat, funktionieren leider nicht mehr unter Vista oder neuer. Beim Aufruf von "AddToSnapshotSet" gibt es jedes mal einen Integer-Overflow. Google war bei der Suche nach einer Lösung leider auch nicht hilfreich.

Viele Grüße

Heiko

[1] http://bit.ly/b0qkV9
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#2

Re: Volume Shadow Copy Service nutzen

  Alt 15. Feb 2010, 09:52
Die Header müssen funktionieren, da nach COM Regeln, sich die Schnittstellen nicht ändern, aber neue hinzukommen dürfen.

Scheint mir daher ein Programmier- bzw. Übersetzungsfehler zu sein.
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Volume Shadow Copy Service nutzen

  Alt 15. Feb 2010, 10:05
Ich habe mal die VSS-Dateien des Delphi Magazins, die ich verwende angehängt. Das einzige, was ich geändert habe, ist die Umstellung von static auf dynamic linking.

Folgende Routine dürfte ergo unter Vista/7 nicht durchlaufen
Delphi-Quellcode:
Const
  SYSTEM_WRITER_NAME = 'System Writer';
  SYSTEM_FILES_COMPONENT_NAME = 'System Files';

Var
  InstanceGUID : TGUID;
  WriterGUID : TGUID;
  BackupComps : IVssBackupComponents;
  SetGUID : TGUID;
  SnapGUID : TGUID;
  Async : IVssAsync;
  SnapProp : VSS_SNAPSHOT_PROP;
  SourceFile : String;
  Drive : String;
  ShadowPath : String;
  Path : String;
  DestPath : String;
  ErrorMsg : String;

begin
  BackupLogMemo.Clear();
  BackupLogMemo.Lines.Add('Starting backup operation.');
  BackupProgressBar.Position := 0;
  BackupProgressBar.Max := 10;
  GetVssGUIDsByName(SYSTEM_WRITER_NAME,InstanceGUID,WriterGUID);
  BackupLogMemo.Lines.Add('Writer name = "'+SYSTEM_WRITER_NAME+'".');
  BackupLogMemo.Lines.Add('Instance = '+GUIDToString(InstanceGUID)+'.');
  BackupLogMemo.Lines.Add('Writer = '+GUIDToString(WriterGUID)+'.');
  BackupProgressBar.StepIt();
  GetBackupComponentsAndInitialize(BackupComps,WriterGUID);
  BackupProgressBar.StepIt();
  OleCheck(BackupComps.SetBackupState(True,False,VSS_BT_COPY,False));
  BackupLogMemo.Lines.Add('Backup state has been set.');
  BackupProgressBar.StepIt();
  BackupLogMemo.Lines.Add('Starting a snapshot set...');
  OleCheck(BackupComps.StartSnapshotSet(SetGUID));
  BackupLogMemo.Lines.Add('Created backup set with ID '+GUIDToString(SetGUID)+'.');
  BackupProgressBar.StepIt();
  SourceFile := FileToBackUpEdit.Text;
  BackupLogMemo.Lines.Add('Source file = "'+SourceFile+'".');
  Drive := IncludeTrailingPathDelimiter(ExtractFileDrive(SourceFile));
  BackupLogMemo.Lines.Add('Drive to snapshot = '+Drive+'.');
  OleCheck(BackupComps.AddToSnapshotSet(Drive,GUID_NULL,SnapGUID)); // hier kommt immer der Integer overflow
  BackupLogMemo.Lines.Add('Drive '+Drive+' has been added to the set.');
  BackupLogMemo.Lines.Add('Snap GUID = '+GUIDToString(SnapGUID)+'.');
  BackupProgressBar.StepIt();
  OleCheck(BackupComps.AddComponent(InstanceGUID,WriterGUID,
           VSS_CT_FILEGROUP,nil,SYSTEM_FILES_COMPONENT_NAME));
  BackupLogMemo.Lines.Add('System component added.');
  BackupProgressBar.StepIt();
  Try
    OleCheck(BackupComps.PrepareForBackup(Async));
    Async.Wait(INFINITE);
    Async := nil;
    BackupLogMemo.Lines.Add('Preparations for backup finished.');
    BackupProgressBar.StepIt();
    OleCheck(BackupComps.DoSnapshotSet(Async));
    Async.Wait(INFINITE);
    Async := nil;
    BackupLogMemo.Lines.Add('Snapshot done.');
    BackupProgressBar.StepIt();
    { start the real backup }
    OleCheck(BackupComps.GetSnapshotProperties(SnapGUID,SnapProp));
    BackupLogMemo.Lines.Add('Got backup properties.');
    BackupProgressBar.StepIt();
    If ShowMetadataCheckBox.Checked Then Begin
      OutputBackupProperties(SnapProp);
    End;
    { copy files }
    Path := System.Copy(SourceFile,3,Length(SourceFile)-2); { remove drive ("C:") }
    ShadowPath := WideCharToString(SnapProp.m_pwszSnapshotDeviceObject);
    Path := ShadowPath+Path;
    DestPath := IncludeTrailingPathDelimiter(DestinationDirEdit.Text)+
                ExtractFileName(SourceFile);
    BackupLogMemo.Lines.Add('Shadow path (source) = "'+Path+'".');
    BackupLogMemo.Lines.Add('Destination file = "'+DestPath+'".');
    BackupProgressBar.StepIt();
    If (Not CopyFile(PAnsiChar(Path),PAnsiChar(DestPath),True)) Then Begin
      ErrorMsg := 'File backup failed: '+SysErrorMessage(GetLastError())+'.';
      BackupLogMemo.Lines.Add(ErrorMsg);
      ShowMessage(ErrorMsg);
    End
    Else Begin
      ErrorMsg := 'File backup OK!';
      BackupLogMemo.Lines.Add(ErrorMsg);
      ShowMessage(ErrorMsg);
    End;
    { clean up }
    BackupLogMemo.Lines.Add('Cleaning up resources...');
    VssFreeSnapshotProperties(@SnapProp);
    OleCheck(BackupComps.SetBackupSucceeded(InstanceGUID,WriterGUID,
             VSS_CT_FILEGROUP,nil,SYSTEM_FILES_COMPONENT_NAME,True));
  Finally
    BackupComps.BackupComplete(Async);
    Async.Wait(INFINITE);
    Async := nil;
    BackupLogMemo.Lines.Add('Backup is now complete.');
    BackupProgressBar.Position := 0;
  End;
Angehängte Dateien
Dateityp: pas vssutilities_134.pas (3,9 KB, 320x aufgerufen)
Dateityp: pas vssapi_192.pas (15,1 KB, 279x aufgerufen)
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#4

Re: Volume Shadow Copy Service nutzen

  Alt 15. Feb 2010, 10:07
Sind das auch gleichwertige OS?

Nicht daß es z.B. auf XP-32 geht und du es jetzt nur unter Vista/Seven-64 getestet hast.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Volume Shadow Copy Service nutzen

  Alt 15. Feb 2010, 10:09
Also ich kann das nur unter Windows 7 32 Bit testen. Aber Du hast Recht, irgendwo hab ich was gelesen, das sich die API zwischen XP und Vista geändert hat und nicht mehr (binär) kompatibel ist.
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

Re: Volume Shadow Copy Service nutzen

  Alt 15. Feb 2010, 10:32
Hi,

habe bei MSDN mal nachgeschaut, es steht immer noch Version 7.2 des SDK's zur Verfügung.
Allerdings gibt es in der VssAPI.pas ein kleinen Stolperstein, CreateVssBackupComponents hat
unter XP-32 den Index 12.

Gruss
  Mit Zitat antworten Zitat
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Volume Shadow Copy Service nutzen

  Alt 15. Feb 2010, 10:38
Zitat von Alter Mann:
Allerdings gibt es in der VssAPI.pas ein kleinen Stolperstein, CreateVssBackupComponents hat
unter XP-32 den Index 12.
Darum ja auch das dynamische Linken in der VssUtilities.pas mittels Delphi-Referenz durchsuchenSafeLoadLibrary und Delphi-Referenz durchsuchenGetProcAddress
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#8

Re: Volume Shadow Copy Service nutzen

  Alt 15. Feb 2010, 10:47
Zitat von HeikoAdams:
Darum ja auch das dynamische Linken in der VssUtilities.pas mittels Delphi-Referenz durchsuchenSafeLoadLibrary und Delphi-Referenz durchsuchenGetProcAddress
Bist du sicher, daß diese Funktion dann auch gefunden wird?
Immerhin scheinst du dieses ja nicht zu prüfen.

Da diese Funktion sonst immer über einen Index und nicht via Name gelinkt wird, könnte es glatt sein, daß sie in der Exportabelle garnicht namentlich enthalten ist und somit auch nicht über einen Namen gefunden werden kann.

Und das Ergebnis von CreateVssBackupComponents prüfst du auch nicht mehr. (OleCheck)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#9

Re: Volume Shadow Copy Service nutzen

  Alt 15. Feb 2010, 10:52
In der MSDN Beschreibung zu MSDN-Library durchsuchenCreateVssBackupComponents steht:
Zitat:
Note This function is exported as CreateVssBackupComponentsInternal, but you should call CreateVssBackupComponents, not CreateVssBackupComponentsInternal.
Also lasse ich GetProcAddress auf CreateVssBackupComponentsInternal losgehen. Oder mach ich schon was falsch?

Zitat von himitsu:
Und das Ergebnis von CreateVssBackupComponents prüfst du auch nicht mehr. (OleCheck)
[x] fixed -> danke
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#10

Re: Volume Shadow Copy Service nutzen

  Alt 15. Feb 2010, 11:04
Hmmm, wenn MS das so sagt.

Warum nutzten dann die Anderen den Index?

Aber dennoch sollte man Prüfen, ob es auch wirklich gefunden wurde.

PS: Wenn du den Namen kennst, dann kannste das doch auch als Hartlink aufrufen.
Delphi-Quellcode:
Function CreateVssBackupComponents(
  Var ppBackup : IVssBackupComponents) : HRESULT; StdCall;
  External VSS_API_DLL Name 'CreateVssBackupComponentsInternal';
Zitat:
Doubly indirect pointer to the created IVssBackupComponents interface object.
Aber dieses "Doubly" kommt mir komisch vor

VAR ist doch nur ein einfacher Zeiger.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz