• 使用7z.dll完成简单解压缩


    首先去7z官网下载代码 7z的源代码或者lzma都可以,但是推荐下7z的源代码,里面东西比较全

    7z.dll 通过 COM 接口工作。但是它并没有使用标准的 COM 接口 。如果有com基础的话 看他的代码会比较容易。

    比较简单的例子是 /cpp/7zip/ui/client7z 里面有简单的 压缩 解压缩 和查看压缩包文件。 7z.dll的源代码在 bundles/7zformatf 里面

    其中 clinet7z和 file manager的代码看起来比较好理解,可以自己一步一步跟着走。 // 晚上再更新 

    7z.dll 采用com接口工作,但是它并没有使用标准的COM接口。

    对文件的解压主要靠下面两个回调类

    / Archive Open callback class

    // 压缩文件打开回调类  class CArchiveOpenCallback:

     public IArchiveOpenCallback,

     public ICryptoGetTextPassword,

     public CMyUnknownImp

    // 解压回调类  class CArchiveExtractCallback:               

    public IArchiveExtractCallback,

     public ICryptoGetTextPassword,

     public CMyUnknownImp

    解压回调类中

    // IProgress

     STDMETHOD(SetTotal)(UInt64 size); //获得加压文件总字节数

     STDMETHOD(SetCompleted)(const UInt64 *completeValue); //获取当前解压文件大小字节数 可以再这个回调函数中自己计算当前的解压进度。

      //IArchiveExtractCallback

     STDMETHOD(GetStream)(UInt32 index, ISequentialOutStream **outStream,Int32 askExtractMode); //获取文件流,

    LRESULT MyReleaseSteam(); //当取消解压时,释放文件流控制权原因取消解压后没有走到SetOperationResult()回调函数,而释放文件流就在这个函数中,所以要自己释放。

     //获取接口函数

    CreateObjectFunc createObjectFunc = (CreateObjectFunc)lib.GetProc("CreateObject");

     CMyComPtr<IInArchive> archive;

    errorcode =  createObjectFunc(&CLSID_CFormat7z, &IID_IInArchive, (void **)&archive);

    CInFileStream *fileSpec = new CInFileStream;

    CMyComPtr<IInStream> file = fileSpec;

    UString archiveName = GetUnicodeString(inFile);

    if (!fileSpec->Open(archiveName))

    {

    //打不开压缩文件,(找不到该文件)

     return ;

    }

    CArchiveOpenCallback *openCallbackSpec = new CArchiveOpenCallback;

    CMyComPtr<IArchiveOpenCallback> openCallback(openCallbackSpec);

    openCallbackSpec->PasswordIsDefined = false;

    errorcode = archive->Open(file, 0, openCallback);

    if (errorcode != S_OK)

        return;

    // Extract command

    CArchiveExtractCallback *extractCallbackSpec = new CArchiveExtractCallback;

     CMyComPtr<IArchiveExtractCallback> extractCallback(extractCallbackSpec);

     extractCallbackSpec->Init(archive, OutFile); // second parameter is output folder path

    extractCallbackSpec->PasswordIsDefined = false;

    extractCallbackSpec->SetFileInfo(info);

    // extractCallbackSpec->PasswordIsDefined = true;

    // extractCallbackSpec->Password = L"1";

    errorcode = archive->Extract(NULL, (UInt32)(Int32)(-1), false, extractCallback);

    if (errorcode != S_OK)

        return;

  • 相关阅读:
    二叉堆(最小堆, 最大堆)介绍与实现
    C++ 用变量定义数组
    C++ 用变量定义数组
    053185
    053184
    053183
    053182
    053181
    053180
    oracle prior
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/2754009.html
Copyright © 2020-2023  润新知