Tôi đã có những rắc rối tương tự, sau khi rất nhiều hit-and-thử nghiệm tôi đã quản lý để có được ở đâu đó ... đây là một đoạn mã mà có thể giúp:
#include <stdio.h>
#include <windows.h>
#include <winbase.h>
#include <Vss.h>
#include <VsWriter.h>
#include <VsBackup.h>
int main()
{
int retCode = 0;
int i=0;
HRESULT hr;
IVssEnumObject *pIEnumSnapshots;
IVssBackupComponents *ab;
VSS_OBJECT_PROP Prop;
VSS_SNAPSHOT_PROP& Snap = Prop.Obj.Snap;
WCHAR existingFilePath[MAX_PATH] = TEXT("\\temp\\PrinterList.txt");
WCHAR newFileLocation[MAX_PATH] = TEXT("c:\\Users\\PrinterList.txt");
TCHAR existingFileLocation[MAX_PATH];
if (CoInitialize(NULL) != S_OK)
{
printf("CoInitialize failed!\n");
return 1;
}
hr = CreateVssBackupComponents(&ab);
if(hr != S_OK)
{
printf("Failed at CreateVssBackupComponents Stage");
return 1;
}
hr = ab->InitializeForBackup();
if(hr != S_OK)
{
printf("Failed at InitializeForBackup Stage");
return 1;
}
hr = ab->SetContext(VSS_CTX_ALL);
if(hr != S_OK)
{
printf("Failed at SetContext Stage");
return 1;
}
hr = ab->Query(GUID_NULL,VSS_OBJECT_NONE, VSS_OBJECT_SNAPSHOT, &pIEnumSnapshots);
if(hr != S_OK){
printf("Failed at Query Stage");
return 1;
}
// Enumerate all shadow copies.
printf("Recursing through snapshots...\n");
while(true)
{
// Get the next element
ULONG ulFetched;
hr = pIEnumSnapshots->Next(1, &Prop, &ulFetched);
// We reached the end of list
if (ulFetched == 0)
break;
wprintf(L"Snapshot:%s\n", Snap.m_pwszSnapshotDeviceObject);
/*
At this point you have the Snap object with all the information required for copying the file.
example:
Snap.m_pwszSnapshotDeviceObject is the root for snapshot object
(like \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1)
Snap.m_pwszOriginalVolumeName is the full unicode name
(like \\?\Volume{1240872a-88de-11df-a94d-806e6f6e6963}\)
for the original root(c: mostly)
So, you can use CopyFile() to do what you want
*/
wcscpy(existingFileLocation, Snap.m_pwszSnapshotDeviceObject);
wcscat(existingFileLocation, existingFilePath);
CopyFile(existingFileLocation, newFileLocation, false);
//false here will enable over-write
}
return retCode;
}
Lưu ý: Nếu máy mục tiêu của bạn không giống với máy xây dựng, bạn sẽ cần bao gồm các định nghĩa và cấu hình xây dựng phù hợp.
Lưu ý: Bạn sẽ phải sử dụng các wchars gây phiền nhiễu ở khắp mọi nơi, bởi vì các chức năng này sử dụng chúng.
Xin lỗi vì câu trả lời trễ, tôi muốn cảm ơn vì mẫu của bạn - tôi hy vọng nó sẽ giúp người khác, bởi vì nó không giống như C? –
Đúng là C, một số định nghĩa kiểu C++ là gây hiểu lầm. Tôi sẽ chỉnh sửa nó và làm cho nó tiêu chuẩn C, ngày mai (có một thời hạn để tham dự ngày hôm nay). – lalli
Ở đây bạn đi, chủ yếu là C bây giờ (với win32 tất nhiên, cần thiết cho API) ... – lalli