• C++调用VSS API进行快照


    VSS SDK下载

    官网链接 :https://www.microsoft.com/en-us/download/details.aspx?id=23490
    备用链接:https://download.csdn.net/download/qq_39107008/86268823

    C++工程搭建

    1. 解压VSS SDK
      运行setup.exe,解压到任意路径,如下图
      在这里插入图片描述2. 工程环境搭建
      初始化c++项目完成后,引用VSS SDK,配置如下:
      进入 项目-》属性-》VC++目录(静态链接)
      本地vss解压目录下的inc目录填写到外部包含目录(头文件)
      本地vss解压目录下的lib目录填写到源目录(静态编译出的lib文件),这里需要根据运行的机器型号进行目录选择(x86/x64)
      在这里插入图片描述配置依赖项
      项目-》属性-》链接器-》输入-》附加依赖项(vssapi.lib)
      ![在这里插入图片描述](https://img-blog.csdnimg.cn/3d3ea10f51834593abb59b14431d21a0.png

    示例代码

    参考:
    参考微软文档
    vss sdk解压目录中的TestApps\betest项目借鉴
    在这里插入图片描述

    别人链接代码(应该是有问题): http://cn.voidcc.com/question/p-tymlbrfv-bc.html

    #include <stdio.h> 
    #include <windows.h> 
    #include <winbase.h> 
    #include <iostream>
    #include <Vss.h> 
    #include <VsWriter.h> 
    #include <VsBackup.h> 
    
    using namespace std;
    
    int main()
    {
        //定义需要快照卷
        WCHAR wszVolumes[2048] = L"F:\\";
    
        bool bCoInitializeSucceeded = false;
    
        try
        {
            HRESULT hr = S_OK;
            CoInitializeEx(NULL, COINIT_MULTITHREADED);
    
            // Initialize COM security
            CoInitializeSecurity
            (
                NULL,                                //  IN PSECURITY_DESCRIPTOR         pSecDesc,
                -1,                                  //  IN LONG                         cAuthSvc,
                NULL,                                //  IN SOLE_AUTHENTICATION_SERVICE *asAuthSvc,
                NULL,                                //  IN void                        *pReserved1,
                RPC_C_AUTHN_LEVEL_CONNECT,           //  IN DWORD                        dwAuthnLevel,
                RPC_C_IMP_LEVEL_IMPERSONATE,         //  IN DWORD                        dwImpLevel,
                NULL,                                //  IN void                        *pAuthList,
                EOAC_NONE,                           //  IN DWORD                        dwCapabilities,
                NULL                                 //  IN void                        *pReserved3
            );
    
            bCoInitializeSucceeded = true;
    
            IVssAsync* pAsync;
            IVssBackupComponents* pvbc;
            CreateVssBackupComponents(&pvbc);
            pvbc->InitializeForBackup();
            pvbc->SetBackupState(true, false, VSS_BT_FULL, true);
            pvbc->GatherWriterMetadata(&pAsync);  
    
            VSS_ID idSet, idSnap;
            pvbc->StartSnapshotSet(&idSet);
            pvbc->AddToSnapshotSet(wszVolumes, GUID_NULL, &idSnap);
            pvbc->PrepareForBackup(&pAsync);
            
    
            HRESULT hrResult;
            INT nPercentDone = 0;
            pvbc->DoSnapshotSet(&pAsync);
    
            pAsync->Wait();
    
            pAsync->QueryStatus(&hrResult, &nPercentDone);
            return 0;
        }
        catch (HRESULT hrParse)
        {
            return -1;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    运行结果

    在这里插入图片描述在这里插入图片描述

  • 相关阅读:
    gitlab-runner注册失败提示401 Unauthorized解决
    获取IP地址-根据IP获取位置信息
    Vim编辑器常用命令汇总
    Spring Boot 使用 Disruptor 做内部高性能消息队列
    上犹县寺下镇泥坑村 国稻种芯·中国水稻节:江西赣州稻种尽收
    进程间通信-内存映射
    EventSystem 事件系统
    GitHub官方出手,一针见血。Spring Boot趣味实战手册来袭(彩版)
    vscode git提交
    代码越写越乱?那是因为你没用责任链
  • 原文地址:https://blog.csdn.net/qq_39107008/article/details/126090211