0

The code compiles fine and I have included the vssapi.lib in the additional dependencies for the linker.

I get this error saying "CreatevssbackupcomponentsInternal procedure entry point could not be found in vssapi.dll"

And I get this error only when I try to run it on Windows server 2003 or Windows XP. It runs fine on Windows 7.

I will attach the code below, it is the standard shadow copy code.

// copy.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <iostream>

#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;
    IVssAsync *pPrepareForBackupResults;
    GUID SnapshotSetID = GUID_NULL;

    VSS_OBJECT_PROP Prop;
    WCHAR wszVolumePathName[MAX_PATH]; 
    GUID snapshotID; 
    wcscpy(wszVolumePathName, L"E:\\");

    VSS_SNAPSHOT_PROP snapshotProperties;
    WCHAR existingFilePath[MAX_PATH] = TEXT("\\temp\\");
    WCHAR newFileLocation[MAX_PATH] = TEXT("c:\\Users\\");
    LPWCH pwszExposed;
    int *x;
    LONG deletedsnapshots = 0 ;
    GUID nondeletedsnapshots;
    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");
        std::cout<<hr;
        return 1;
    }

    hr = ab->SetContext( VSS_CTX_FILE_SHARE_BACKUP);

    hr = ab->StartSnapshotSet(&SnapshotSetID);

    if(hr != S_OK)
    {
        printf("Failed at StartSnapshotset Stage");
        return 1;
    }

    hr = ab->AddToSnapshotSet(wszVolumePathName, GUID_NULL, &snapshotID); 

    if(hr != S_OK)
    {
        printf("Failed at AddtoSnapshotset Stage");
        return 1;
    }
    hr = ab->PrepareForBackup(&pPrepareForBackupResults);
    if(hr != S_OK)
    {
        printf("Failed at Backup");
    }

    hr = ab->DoSnapshotSet(&pPrepareForBackupResults);

    if(hr != S_OK)
    {
        printf("Failed at DoSnapshotset Stage");
        return 1;
    }

    while(true){
        pPrepareForBackupResults->QueryStatus(&hr, NULL);
        if(hr == VSS_S_ASYNC_FINISHED){
            break;
        }
    }

    hr = ab->GetSnapshotProperties(snapshotID, &snapshotProperties);
    if(hr != S_OK)
    {
        printf("Failed at GetSnapshotset Stage");
        return 1;
    }

    hr = ab->ExposeSnapshot(snapshotID, NULL, VSS_VOLSNAP_ATTR_EXPOSED_LOCALLY, L"C:\ShadowOff", &pwszExposed);

    wcscpy(existingFilePath,snapshotProperties.m_pwszOriginalVolumeName);
    wcscat(existingFilePath, L"downloads\\aa.exe");

    HANDLE hSourceFile = CreateFile(existingFilePath, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);

    hr = ab->DeleteSnapshots(SnapshotSetID, VSS_OBJECT_SNAPSHOT_SET ,FALSE, &deletedsnapshots, &nondeletedsnapshots);
    if(hr != S_OK)
    {
        printf("Failed at DeleteSnapshotset Stage");
        return 1;
    }
    return retCode;
}
Dave Rager
  • 8,002
  • 3
  • 33
  • 52
roymustang86
  • 8,054
  • 22
  • 70
  • 101

1 Answers1

2

You have to use the Windows Shadow Copy SDK for Windows versions prior to Windows Vista: http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=23490

UrOni
  • 431
  • 4
  • 9
  • Hey, I wish I can upvote your answer, because that is write but I dont have enough rep. I got the hint when I looked at Hobocopy source code, and there was a directory included saying inc\winxp and inc\win2003 for the different configuration. When you download Windows SDK 7.2, there are two folders under the inc folder, you have to copy it to your project directory and add the path to that folder. – roymustang86 Jul 07 '11 at 13:53