gpt4 book ai didi

使用 IShellDispatch 的 C++ 解压缩失败

转载 作者:搜寻专家 更新时间:2023-10-31 02:21:01 29 4
gpt4 key购买 nike

所以我有一个非常简单的工作要做:解压缩一个 zip 文件。我以为我会在 5 秒内在线找到一个简单的解决方案,但我仍在苦苦挣扎。

我显然已经阅读了这些帖子:

但答案建议使用zliblibzipminiz。我相信这些方法效果很好。然而,在现有的 VS2013 解决方案中尝试应用这种方法似乎并不简单。

然后我遇到了这个简单的解决方案,ref1 , ref2 ,利用 IShellDispatch object

我赶紧去实现它:

bool DecompressZIP(_In_ const wpath& pathFile, _In_ const wpath& pathDstDir)
{
BSTR source = _bstr_t(pathFile.string().c_str());
BSTR dest = _bstr_t(pathDstDir.string().c_str());

HRESULT hResult = S_FALSE;
IShellDispatch *pIShellDispatch = NULL;
Folder *pToFolder = NULL;
VARIANT variantDir, variantFile, variantOpt;

CoInitialize(NULL);

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

if (SUCCEEDED(hResult) && NULL != pIShellDispatch)
{
VariantInit(&variantDir);
variantDir.vt = VT_BSTR;
variantDir.bstrVal = dest;
hResult = pIShellDispatch->NameSpace(variantDir, &pToFolder);

if (SUCCEEDED(hResult) && NULL != pToFolder)
{
Folder *pFromFolder = NULL;
VariantInit(&variantFile);
variantFile.vt = VT_BSTR;
variantFile.bstrVal = source;
hResult = pIShellDispatch->NameSpace(variantFile, &pFromFolder);

if (SUCCEEDED(hResult) && NULL != pFromFolder)
{
FolderItems *fi = NULL;
pFromFolder->Items(&fi);

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

VARIANT newV;
VariantInit(&newV);
newV.vt = VT_DISPATCH;
newV.pdispVal = fi;
hResult = pToFolder->CopyHere(newV, variantOpt);
Sleep(1000);
pFromFolder->Release();
pToFolder->Release();
}
}
pIShellDispatch->Release();
}

CoUninitialize();

return true;
}

但它不起作用!

行:hResult = pIShellDispatch->NameSpace(variantFile, &pFromFolder);始终导致 pFromFolder == NULL

  • hResultS_FALSE
  • SUCCEEDED(hResult) 为真
  • GetLastError 为 0

问题

我做错了什么?

最佳答案

bool CUnZip::Unzip2Folder(BSTR lpZipFile, BSTR lpFolder)
{
IShellDispatch *pISD;
Folder *pZippedFile = 0L;
Folder *pDestination = 0L;

long FilesCount = 0;
IDispatch* pItem = 0L;
FolderItems *pFilesInside = 0L;

VARIANT Options, OutFolder, InZipFile, Item;
CoInitialize(NULL);
__try{
if (CoCreateInstance(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void **)&pISD) != S_OK)
return 1;

InZipFile.vt = VT_BSTR;
InZipFile.bstrVal = lpZipFile;
pISD->NameSpace(InZipFile, &pZippedFile);
if (!pZippedFile)
{
pISD->Release();
return 1;
}

OutFolder.vt = VT_BSTR;
OutFolder.bstrVal = lpFolder;
pISD->NameSpace(OutFolder, &pDestination);
if (!pDestination)
{
pZippedFile->Release();
pISD->Release();
return 1;
}

pZippedFile->Items(&pFilesInside);
if (!pFilesInside)
{
pDestination->Release();
pZippedFile->Release();
pISD->Release();
return 1;
}

pFilesInside->get_Count(&FilesCount);
if (FilesCount < 1)
{
pFilesInside->Release();
pDestination->Release();
pZippedFile->Release();
pISD->Release();
return 0;
}

pFilesInside->QueryInterface(IID_IDispatch, (void**)&pItem);

Item.vt = VT_DISPATCH;
Item.pdispVal = pItem;

Options.vt = VT_I4;
Options.lVal = 1024 | 512 | 16 | 4;//http://msdn.microsoft.com/en-us/library/bb787866(VS.85).aspx

bool retval = pDestination->CopyHere(Item, Options) == S_OK;

pItem->Release(); pItem = 0L;
pFilesInside->Release(); pFilesInside = 0L;
pDestination->Release(); pDestination = 0L;
pZippedFile->Release(); pZippedFile = 0L;
pISD->Release(); pISD = 0L;

return retval;

}
__finally
{
CoUninitialize();
}

来源:https://social.msdn.microsoft.com/Forums/vstudio/en-US/45668d18-2840-4887-87e1-4085201f4103/visual-c-to-unzip-a-zip-file-to-a-specific-directory?forum=vclanguage

在主要情况下,您调用:

CUnZip * Z = new CUnZip();
BSTR bstrFile = strFileName.AllocSysString();
BSTR bstrPath = m_strPathName.AllocSysString();
Z->Unzip2Folder(bstrFile, bstrPath);
delete Z;
Z = NULL;

关于使用 IShellDispatch 的 C++ 解压缩失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31957242/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com