不用第三方工具解压zip档案
来源:互联网 发布:linux firefox 更新 编辑:程序博客网 时间:2024/09/21 09:22
下面的是KeSummer给我的问题的答案,其所说的方法和提供的代码经过验证时可行的,感谢KeSummer的指点。
原帖地址链接:http://topic.csdn.net/u/20090108/16/d5aebfec-b916-449e-ae88-02dd45388804.html#replyachor
原理:zipfldr.dll是个COM组件,但是尚未公开接口,但是我们可以打开一个隐藏的explorer窗口,然后把ZIP的内容悄悄地复制出来,这就相当于解压了。下面是代码,测试例子:UnZipFolder("d://aa.zip","c://解压文件夹");请确保c盘下解压文件夹存在。。。
bool UnZipFolder(LPCTSTR zipFile,LPCTSTR destination)
{
DWORD strlen = 0;
HRESULT hResult;
IShellDispatch *pISD;
Folder *pToFolder = NULL;
Folder *pFromFolder = NULL;
FolderItems *pFolderItems = NULL;
FolderItem *pItem = NULL;
VARIANT vDir, vFile, vOpt;
BSTR strptr1, strptr2;
CoInitialize(NULL);
bool bReturn = false;
hResult = CoCreateInstance(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER,
IID_IShellDispatch, (void **)&pISD);
if(FAILED(hResult))
{
return bReturn;
}
VariantInit(&vOpt);
vOpt.vt = VT_I4;
vOpt.lVal = 16+4; // Do not display a progress dialog box ~ This will not work properly!
CString strZipFile(zipFile);
CString strDestination(destination);
strptr1 = strZipFile.AllocSysString();
strptr2 = strDestination.AllocSysString();
VariantInit(&vFile);
vFile.vt = VT_BSTR;
vFile.bstrVal = strptr1;
hResult = pISD->NameSpace(vFile, &pFromFolder);
VariantInit(&vDir);
vDir.vt = VT_BSTR;
vDir.bstrVal = strptr2;
hResult = pISD->NameSpace(vDir, &pToFolder);
if(S_OK == hResult)
{
hResult = pFromFolder->Items(&pFolderItems);
if(SUCCEEDED(hResult))
{
long lCount = 0;
pFolderItems->get_Count(&lCount);
IDispatch* pDispatch = NULL;
pFolderItems->QueryInterface(IID_IDispatch,(void**)&pDispatch);
VARIANT vtDispatch;
VariantInit(&vtDispatch);
vtDispatch.vt = VT_DISPATCH;
vtDispatch.pdispVal = pDispatch;
//cout << "Extracting files .../n";
hResult = pToFolder->CopyHere(vtDispatch,vOpt);
if(hResult != S_OK) return false;
//Cross check and wait until all files are zipped!
FolderItems* pToFolderItems;
hResult = pToFolder->Items(&pToFolderItems);
if(S_OK == hResult)
{
long lCount2 = 0;
hResult = pToFolderItems->get_Count(&lCount2);
if(S_OK != hResult)
{
pFolderItems->Release();
pToFolderItems->Release();
SysFreeString(strptr1);
SysFreeString(strptr2);
pISD->Release();
CoUninitialize();
return false;
}
//Use this code in a loop if you want to cross-check the items unzipped.
/*if(lCount2 != lCount)
{
pFolderItems->Release();
pToFolderItems->Release();
SysFreeString(strptr1);
SysFreeString(strptr2);
pISD->Release();
CoUninitialize();
return false;
}*/
bReturn = true;
}
pFolderItems->Release();
pToFolderItems->Release();
}
pToFolder->Release();
pFromFolder->Release();
}
//cout << "Over!/n";
SysFreeString(strptr1);
SysFreeString(strptr2);
pISD->Release();
CoUninitialize();
return bReturn;
}
- 不用第三方工具解压zip档案
- 不用第三方工具调试BUG
- Zip解压工具类
- ZIP数据压缩/解压工具
- 给Win2003分区增容(不用第三方工具)
- 不用任何第三方工具,如何备份InnoDB?生产环境
- 不用第三方工具解压缩msi文件提取文件
- c# 第三方解压sharpziplib
- .net第三方工具
- SqLite 第三方工具
- 第三方分析工具
- 使用第三方工具
- 一些第三方工具
- 第三方工具网站
- java zip压缩解压 工具类
- 压缩/解压ZIP/GZIP工具类
- Java-工具类之ZIP压缩解压
- C++ SWAP 不用第三方变量 实现
- openswan的pluto协商不成功的原因
- delphi virtual dynamic
- 链接服务器访问Excel
- PHP生成随机字符串的方法
- 09下半年软设28题
- 不用第三方工具解压zip档案
- MTK编译MODIS
- MTK手机软件系统的配置(4)
- 2010年信息系统项目管理师 下午论文应试策略和写作指南
- 原创:非常强大的图片裁剪程序(ImageCutter)
- CString的工作原理介绍
- PHP计算页面执行时间
- flex tree 默认展开
- 博客营销的特性 - 聚锐网