![]() |
Volume Shadow Copy Service nutzen
Hallo,
gibt es hier jemanden, der den Volume Shadow Copy Service mit Delphi nutzt? :gruebel: 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] ![]() |
Re: Volume Shadow Copy Service nutzen
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. |
Re: Volume Shadow Copy Service nutzen
Liste der Anhänge anzeigen (Anzahl: 2)
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; |
Re: Volume Shadow Copy Service nutzen
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. |
Re: Volume Shadow Copy Service nutzen
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.
|
Re: Volume Shadow Copy Service nutzen
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 |
Re: Volume Shadow Copy Service nutzen
Zitat:
![]() ![]() |
Re: Volume Shadow Copy Service nutzen
Zitat:
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) |
Re: Volume Shadow Copy Service nutzen
In der MSDN Beschreibung zu
![]() Zitat:
Zitat:
|
Re: Volume Shadow Copy Service nutzen
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:
VAR ist doch nur ein einfacher Zeiger. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz