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」已存在。還試圖找到「文件夾」變量上的任何內容都非常棘手,因爲谷歌帶回了一切,但我正在尋找。
有沒有人可以對此有所瞭解,甚至可以告訴我爲什麼會發生這種情況?
10年前我對COM有更多的瞭解......但我認爲你設置BSTR值的方式看起來有點不合適。但是,然後......當我做COM和_bstr_t類型時,我使用了ATL ...... – BitTickler
它們以什麼方式向外看? @BitTickler – Sconz2
https://msdn.microsoft.com/en-us/library/windows/desktop/ms221069(v=vs.85).aspx << - 不僅0終止,而且長度正常前綴。 – BitTickler