c ++ - Korrekt flow af en VSS backup - VSS\_E\_BAD\_STATE fejl

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har problemer med at få et sikkerhedskopieringsjob, der arbejder i VSS og C ++. Det er nu på dagsordenen for at arbejde og sikkerhedskopiere filer, men det fejler, når jeg ringer BackupComplete() med resultatet VSS\_E\_BAD\_STATE, så jeg vil gerne nogle input fra nogen der er bekendt med VSS om, hvorvidt min strøm er korrekt. Jeg gør i øjeblikket følgende:


if( !CHECK\_HRESULT(::CreateVssBackupComponents(&m\_pBackupComponents))  )
{
    throw;
}

if( !CHECK\_HRESULT((hr = m\_pBackupComponents->InitializeForBackup())) )
{
    throw;
}

WCHAR wszVolumePathName[MAX\_PATH];
GUID snapshotId;
BOOL supported = TRUE;
HRESULT hr;
SnapshotMap::iterator it;
BOOL bWorked = ::GetVolumePathName(path.c\_str(), wszVolumePathName, MAX\_PATH); 

if( !bWorked )
{
    throw;
}

if( !CHECK\_HRESULT((hr = m\_pBackupComponents->IsVolumeSupported(GUID\_NULL, wszVolumePathName, &supported))) || !supported )
{
    throw;
}

GUID snapshotSetId;
if( !CHECK\_HRESULT((hr = m\_pBackupComponents->StartSnapshotSet(&snapshotSetId))) )
{
    throw;
}

m\_SnapshotIdList.push\_back(snapshotId);

if( !CHECK\_HRESULT((hr = m\_pBackupComponents->AddToSnapshotSet(wszVolumePathName, GUID\_NULL, &snapshotId))) )
{
    throw;
}

if( !CHECK\_HRESULT((hr = m\_pBackupComponents->SetBackupState(FALSE, FALSE, VSS\_BT\_COPY, FALSE))) )
{
    throw;
}

CComPtr<IVssAsync> pPrepareForBackupResults; 
if( !CHECK\_HRESULT((hr = m\_pBackupComponents->PrepareForBackup(&pPrepareForBackupResults))) )
{
    throw;
}

if( !CHECK\_HRESULT((hr = pPrepareForBackupResults->Wait())) )
{
    pPrepareForBackupResults.Release();
    throw;
}

HRESULT hrPrepareForBackupResults; 
if( !CHECK\_HRESULT((hr = pPrepareForBackupResults->QueryStatus(&hrPrepareForBackupResults, NULL))) )
{
    pPrepareForBackupResults.Release();
    throw;
}

pPrepareForBackupResults.Release();
if( hrPrepareForBackupResults != VSS\_S\_ASYNC\_FINISHED )
{
    throw;
}

CComPtr<IVssAsync> pDoSnapshotSetResults;
if( !CHECK\_HRESULT((hr = m\_pBackupComponents->DoSnapshotSet(&pDoSnapshotSetResults))) )
{
    throw;
}

m\_VssSyncList.push\_back(pDoSnapshotSetResults);

VSS\_SNAPSHOT\_PROP snapshotProperties;
if( !CHECK\_HRESULT((hr = m\_pBackupComponents->GetSnapshotProperties(snapshotId, &snapshotProperties))) )
{
    throw;
}

TSTRING newPath(snapshotProperties.m\_pwszSnapshotDeviceObject);
m\_SnapshotMap.insert(SnapshotMap\_Entry(TSTRING(wszVolumePathName), newPath));
newPath.append(path.substr(2));

<Backup files here>

::VssFreeSnapshotProperties(&snapshotProperties);

for( SnapshotIdList::iterator it = m\_SnapshotIdList.begin(); it != m\_SnapshotIdList.end(); it++ )
{
    LONG cDeletedSnapshots; 
    GUID nonDeletedSnapshotId;
    m\_pBackupComponents->DeleteSnapshots(*it, VSS\_OBJECT\_SNAPSHOT\_SET, TRUE, &cDeletedSnapshots, &nonDeletedSnapshotId); 
}

m\_SnapshotIdList.clear();

for( VssSyncList::iterator it = m\_VssSyncList.begin(); it != m\_VssSyncList.end(); it++ )
{
    (*it).Release();
}

m\_VssSyncList.clear();

CComPtr<IVssAsync> pBackupCompleteResults;
if( !CHECK\_HRESULT((hr = m\_pBackupComponents->BackupComplete(&pBackupCompleteResults))) )
{
    throw;
}
else
{
    if( !CHECK\_HRESULT((hr = pBackupCompleteResults->Wait())) )
    {
        throw;
    }

    HRESULT hrBackupCompleteResults; 
    if( CHECK\_HRESULT(pBackupCompleteResults->QueryStatus(&hrBackupCompleteResults, NULL)) )
    {
        if( hrBackupCompleteResults != VSS\_S\_ASYNC\_FINISHED )
        {
            throw;
        }
    }

    pBackupCompleteResults.Release();
}

m\_SnapshotMap.clear();


Det ser ud til, at noget jeg kalder er i den forkerte rækkefølge, men ser på dokumentationen og forskellige kilder, jeg kan ikke finde ud af, hvad der er i den forkerte rækkefølge.


Er der noget blændende indlysende, at jeg har savnet?

Bedste reference


Ringer du til SetBackupSucceeded efter hver komponent er blevet behandlet og før du ringer BackupComplete ??

Andre referencer 1


Jeg har været fanget med disse fejl, da jeg lærte VSS, for det meste fejlen skyldtes kalder VSS-sekvensen med CoInitialize (). Kontroller, om du har CoInitialize og CoNnitialiser før og efter VSS-sekvensen.