C ++中的Windows VSS(卷影复制)

时间:2011-04-13 13:44:13

标签: c++ c winapi com volume-shadow-service

我需要一些帮助让VSS在C ++中工作。我的基本目标是扫描文件夹中的已更改文件(按修改日期),然后使用VSS将它们备份到另一台设备。文档目前尚不清楚(至少对我来说)我如何做到这一点,我找不到任何体面的例子来说明这一点。

我的流程应该像这样:

扫描文件夹并创建修改文件列表。 创建VSS快照并复制文件。 VSS快照被丢弃或释放(或其他)。

这是我到目前为止所做的事情(为简洁起见,删除了错误处理):

VSS_SNAPSHOT_PROP snapshotProperties;
::CoInitialize(NULL);
::CreateVssBackupComponents(&m_pBackupComponents);
m_pBackupComponents->InitializeForBackup();
m_pBackupComponents->StartSnapshotSet(&m_SnapshotSetId);
m_pBackupComponents->AddToSnapshotSet(wszVolumePathName, GUID_NULL, &snapshotId);
m_pBackupComponents->SetBackupState(TRUE, FALSE, VSS_BT_FULL, FALSE);
m_pBackupComponents->PrepareForBackup(&pPrepareForBackupResults);
pPrepareForBackupResults->Wait();
m_pBackupComponents->DoSnapshotSet(&pDoSnapshotSetResults);
m_pBackupComponents->GetSnapshotProperties(snapshotId, &snapshotProperties); <-- Never gets beyond here

好吧,这似乎是正确的方法,但是,复制线程在代码的最后一行冻结,永远不会再进一步​​。

谢谢, Ĵ

编辑:已更新以显示在GetSnapshotProperties()停留的新方法

2 个答案:

答案 0 :(得分:1)

DoSnapshotset之后,你必须调用以下函数

hr = pDoSnapshotSetResults-&gt; Wait();         if(!SUCCEEDED(hr)){unLoadLibrary();返回1; }

    HRESULT hrDoSnapshotSetResults;

    hr = pDoSnapshotSetResults->QueryStatus(&hrDoSnapshotSetResults, NULL);
    if (!SUCCEEDED(hr)){    unLoadLibrary(); return 1;  }

一旦此功能成功,您就可以获得snapshotproperties。

答案 1 :(得分:0)

通过调用GetSnapshotProperties()来检索VSS_SNAPSHOT_PROP实例。您需要通过调用StartSnapshotSet()创建一个新集,然后在获取属性之前通过AddToSnapshotSet()将该卷添加到快照集。