【发布时间】:2015-11-04 14:12:22
【问题描述】:
所以我有一个非常简单的工作要做:解压缩一个 zip 文件。以为我会在 5 秒内在线找到一个简单的解决方案,但我仍然在苦苦挣扎。
我显然读过这些帖子:
但答案建议使用zlib 和libzip 或miniz。
我确信这些方法效果很好。然而,在现有的 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
-
hResult是S_FALSE -
SUCCEEDED(hResult)是真的 -
GetLastError为 0
问题
我做错了什么?
【问题讨论】:
-
您可以先告诉我们从函数返回的
HRESULT,该函数会向您抛出一个空指针。您是否声称SUCCEEDED(hResult)是 true,但pFromFolder是 NULL ?带有一些详细调试消息的else条件可能证明是值得添加的。如果我必须猜测,那将是您创建的source和destBSTR 值来自临时的bstr_t对象,这些对象在您真正使用之前早已不复存在i> 他们的“内在小孩”.. 即你有一对很好的悬空指针。 -
这是一种冒险的做法。预计在 shell 关联损坏的机器上会出现故障。扔掉这段代码,使用真正的 zip 库。
-
Explorer 中的 Zip 支持无论如何都非常有限。例如。不支持 unicode,不支持安全加密方法,不支持大 (> 4GB) 档案。
标签: c++ winapi zip unzip compression