2015-09-03 209 views
0

我一直在尋找一種將文件壓縮在一起以便通過web服務發送的方法,然後在收到它們後提取它們。我找到了我在這裏顯示的代碼http://www.codeproject.com/Articles/280650/Zip-Unzip-using-Windows-Shell。爲把一個文件到壓縮文件夾中的代碼工作正常,這就是:使用COM從C++中的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」已存在。還試圖找到「文件夾」變量上的任何內容都非常棘手,因爲谷歌帶回了一切,但我正在尋找。

有沒有人可以對此有所瞭解,甚至可以告訴我爲什麼會發生這種情況?

+0

10年前我對COM有更多的瞭解......但我認爲你設置BSTR值的方式看起來有點不合適。但是,然後......當我做COM和_bstr_t類型時,我使用了ATL ...... – BitTickler

+0

它們以什麼方式向外看? @BitTickler – Sconz2

+0

https://msdn.microsoft.com/en-us/library/windows/desktop/ms221069(v=vs.85).aspx << - 不僅0終止,而且長度正常前綴。 – BitTickler

回答

0

好幾乎瘋了試圖找出爲什麼這不起作用,我意識到我有錯誤的源文件的文件名。我有test1.zip而不是test.zip,每次閱讀時都會錯過!簡單,因爲.......