You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用7zxr.dll及编译生成的7.dll、7.lib在C++中实现文件解压

7z相关文件截图

7z文件解压C++实现步骤(基于COM接口)

不用深入掌握COM接口原理,按以下步骤调用即可完成解压:

1. 前期项目配置

  • 将你编译得到的7.dll、7.lib,以及7zxr.dll放到项目工作目录,或者最终生成的exe同级目录下,保证程序运行时可以加载到动态库。
  • 打开项目属性页,在「链接器-输入-附加依赖项」中添加7.lib,完成编译时的符号关联。
  • 将7zSDK的Include目录添加到项目的「C/C++-常规-附加包含目录」,确保可以引入7z.h、IUnknown.h、7zAlloc.h等核心头文件。

2. 核心代码实现

步骤1:初始化COM环境

Windows平台下调用COM接口前需要先初始化环境,全局只需要调用一次:

#include <windows.h>
// 引入7z核心头
#include "7z.h"
#include "7zFile.h"
#include "7zAlloc.h"
#include "7zCrc.h"

int main() {
    // 初始化COM库
    CoInitialize(NULL);

步骤2:创建7z解压接口实例

CMyComPtr<IInArchive> archive;
    // CLSID_CFormat7z是7z格式预定义的类ID,IID_IInArchive是解压接口的ID,都是SDK自带定义
    HRESULT hr = CreateObject(&CLSID_CFormat7z, &IID_IInArchive, (void**)&archive);
    if (FAILED(hr)) {
        // 接口创建失败,检查动态库是否正常加载
        CoUninitialize();
        return -1;
    }

步骤3:打开待解压的7z压缩包

CFileInStream* inStream = new CFileInStream();
    // 替换为你的压缩包实际路径,宽字符加L前缀避免中文乱码
    if (!inStream->Open(L"D:\\test\\test.7z")) {
        inStream->Release();
        archive->Release();
        CoUninitialize();
        return -1;
    }
    // 读取压缩包内容
    hr = archive->Open(inStream, 0, 0);
    if (FAILED(hr)) {
        // 压缩包损坏或格式不合法
        inStream->Release();
        archive->Release();
        CoUninitialize();
        return -1;
    }

步骤4:遍历文件执行解压

// 获取压缩包内的文件总数
    UInt32 fileCount = archive->GetNumberOfItems();
    // 替换为你的实际解压目标目录
    const wchar_t* extractPath = L"D:\\test\\extract\\";

    for (UInt32 i = 0; i < fileCount; i++) {
        // 自动创建解压目标目录
        NFile::NDirectory::CreateComplexDirectory(extractPath);
        const UInt32 extractIndex[] = {i};
        // g_CodecCallback是SDK自带的解压回调,也可以自定义实现获取解压进度
        hr = archive->Extract(extractIndex, 1, 0, &g_CodecCallback);
        if (FAILED(hr)) {
            // 单个文件解压失败处理
            break;
        }
    }

步骤5:释放资源

archive->Close();
    archive->Release();
    inStream->Release();
    // 释放COM环境
    CoUninitialize();
    return 0;
}

3. 常见问题说明

  • 如果需要自定义解压进度、文件重命名等逻辑,只需要自行实现ICodecCallback接口替换掉默认的g_CodecCallback即可。
  • 如果遇到中文路径乱码问题,统一使用宽字符路径(wchar_t类型,字符串加L前缀)即可解决。
  • 程序运行前必须保证7.dll和7zxr.dll都在程序可加载的路径下,否则会出现接口创建失败的错误。

内容的提问来源于stack exchange,提问作者cloud

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 14:33:03