Unzip with shell32 API

EDN Admin

Well-known member
Joined
Aug 7, 2010
Messages
12,794
Location
In the Machine
Hello,
I try the code below to unzip a file into temp folder, however, in Win XP, I always see the progress dialog shown and there are some temporary folder in temp folder while it does not happen in Win 7. An also I got the error message " The file exists".
void Unzip(LPCWSTR zipFile, LPCWSTR unzipPath)<br/>
{<br/>
<span style="white-space:pre BSTR source = ::SysAllocString(zipFile); <br/>
<span style="white-space:pre BSTR dest = ::SysAllocString(unzipPath);<br/>
<br/>
<span style="white-space:pre HRESULT hResult;<br/>
<span style="white-space:pre IShellDispatch *pISD;<br/>
<span style="white-space:pre Folder *pToFolder = NULL;<br/>
<span style="white-space:pre VARIANT vDir, vFile, vOpt;<br/>
<br/>
<span style="white-space:pre CoInitialize(NULL);<br/>
<br/>
<span style="white-space:pre hResult = CoCreateInstance(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, IID_IShellDispatch, (void **)&pISD);<br/>
<span style="white-space:pre if (hResult == S_OK)<br/>
<span style="white-space:pre {<br/>
<span style="white-space:pre VariantInit(&vDir);<br/>
<span style="white-space:pre vDir.vt = VT_BSTR;<br/>
<span style="white-space:pre vDir.bstrVal = dest;<br/>
<span style="white-space:pre hResult = pISD->NameSpace(vDir, &pToFolder);<br/>
<br/>
<span style="white-space:pre if (hResult == S_OK)<br/>
<span style="white-space:pre {<br/>
<span style="white-space:pre Folder *pFromFolder = NULL;<br/>
<br/>
<span style="white-space:pre VariantInit(&vFile);<br/>
<span style="white-space:pre vFile.vt = VT_BSTR;<br/>
<span style="white-space:pre vFile.bstrVal = source;<br/>
<span style="white-space:pre pISD->NameSpace(vFile, &pFromFolder);<br/>
<span style="white-space:pre FolderItems *fi = NULL;<br/>
<span style="white-space:pre pFromFolder->Items(&fi);<br/>
<span style="white-space:pre <span style="white-space:pre <br/>
<br/>
<span style="white-space:pre VariantInit(&vOpt);<br/>
<span style="white-space:pre vOpt.vt = VT_I4;<br/>
<span style="white-space:pre vOpt.lVal = FOF_NO_UI;//4; // Do not display a progress dialog box<br/>
<br/>
<span style="white-space:pre <br/>
<span style="white-space:pre VARIANT newV;<br/>
<span style="white-space:pre VariantInit(&newV);<br/>
<span style="white-space:pre newV.vt = VT_DISPATCH;<br/>
<span style="white-space:pre newV.pdispVal = fi;<br/>
<span style="white-space:pre hResult = pToFolder->CopyHere(newV, vOpt);<br/>
<span style="white-space:pre pToFolder->Release();<br/>
<span style="white-space:pre pFromFolder->Release();<br/>
<span style="white-space:pre }<br/>
<span style="white-space:pre pISD->Release();<br/>
<span style="white-space:pre }<br/>
<span style="white-space:pre SysFreeString( source);<br/>
<span style="white-space:pre SysFreeString( dest);<br/>
<span style="white-space:pre CoUninitialize();<br/>
<br/>
}

Could you advise me what is the root cause? And how can I fix it?
Thanks.

View the full article
 
Back
Top