【问题标题】:Extracting files from zip file in c++ using COM使用 COM 从 C++ 中的 zip 文件中提取文件
【发布时间】:2015-09-03 10:25:39
【问题描述】:

我一直在寻找一种方法,将文件压缩在一起以通过网络服务发送,然后在收到它们后提取它们。我找到了我在这里显示的代码http://www.codeproject.com/Articles/280650/Zip-Unzip-using-Windows-Shell。将文件放入 zip 文件夹的代码可以正常工作,即:

BSTR source = L"C:\\Users\\...\\Desktop\\test1.txt\0\0";
BSTR dest = L"C:\\Users\\...\\Desktop\\test.zip\\\0\0";

HRESULT hResult;
IShellDispatch *pISD;
Folder *pToFolder = NULL;
VARIANT vDir, vFile, vOpt;

CoInitialize(NULL);

hResult = CoCreateInstance
(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void **)&pISD);

if (SUCCEEDED(hResult))
{
  VariantInit(&vDir);
  vDir.vt = VT_BSTR;
  vDir.bstrVal = dest;
  // Destination is our zip file
  hResult = pISD->NameSpace(vDir, &pToFolder);
  if (SUCCEEDED(hResult))
  {

     // Now copy source file(s) to the zip
     VariantInit(&vFile);
     vFile.vt = VT_BSTR;
     vFile.bstrVal = source;

     VariantInit(&vOpt);
     vOpt.vt = VT_I4;
     vOpt.lVal = FOF_NO_UI;

     // Copying and compressing the source files to our zip
     hResult = pToFolder->CopyHere(vFile, vOpt);

     Sleep(1000);
     pToFolder->Release();
   }
   pISD->Release();
}
CoUninitialize();

从 zip 文件中提取文件的代码没有,是这样的:

BSTR source = L"C:\\Users\\...\\Desktop\\test1.zip\\\0\0";
BSTR dest = L"C:\\Users\\...\\Desktop\\unzipto\\\0\0";

HRESULT hResult;
IShellDispatch *pISD;
Folder *pToFolder = NULL;
VARIANT vDir, vFile, vOpt;

CoInitialize(NULL);

hResult = CoCreateInstance
(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void **)&pISD);

if (SUCCEEDED(hResult))
{
  VariantInit(&vDir);
  vDir.vt = VT_BSTR;
  vDir.bstrVal = dest;
  // Destination is our zip file
  hResult = pISD->NameSpace(vDir, &pToFolder);
  if (SUCCEEDED(hResult))
  {
      Folder *pFromFolder = NULL;
      VariantInit(&vFile);
      vFile.vt = VT_BSTR;
      vFile.bstrVal = source;

      pISD->NameSpace(vFile, &pFromFolder);
      FolderItems *fi = NULL;
      pFromFolder->Items(&fi); //----Fails Here!-----

      VariantInit(&vOpt);
      vOpt.vt = VT_I4;
      vOpt.lVal = FOF_NO_UI; // Do not display a progress dialog box

      // Creating a new Variant with pointer to FolderItems to be copied
      VARIANT newV;
      VariantInit(&newV);
      newV.vt = VT_DISPATCH;
      newV.pdispVal = fi;

      hResult = pToFolder->CopyHere(newV, vOpt);
      Sleep(1000);
      pFromFolder->Release();
      pToFolder->Release();
    }
  pISD->Release();
}
CoUninitialize();

程序在pFromFolder->Items(&fi); 失败。

在我运行程序之前,目标文件夹“unzipto”已经存在。尝试在“文件夹”变量上查找任何内容也非常棘手,因为 google 会带回除我要查找的内容之外的所有内容。

有没有人可以对此有所了解,甚至可以告诉我为什么会发生这种情况?

【问题讨论】:

  • 10 年前,我对 COM 了解得更多……但我认为您设置 BSTR 值的方式看起来有点不对劲。但是后来...我在做 COM 和 _bstr_t 类型时使用了 ATL....
  • 他们看起来如何? @BitTickler
  • 谢谢,但我发现我的错误,错误的源文件名! @BitTickler

标签: c++ com zip


【解决方案1】:

好吧,在几乎疯狂地试图找出为什么这不起作用之后,我意识到我的源文件的文件名错误。我有 test1.zip 而不是 test.zip,每次阅读时都错过了它!就这么简单.......

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2020-09-03
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多