// CppExtractZip.cpp : このファイルには 'main' 関数が含まれています。プログラム実行の開始と終了がそこで行われます。 // #include #include #include #include #include // ZIPファイルの展開 BOOL ExtractZip(IShellDispatch* pShellDisp, TCHAR* ZipPath, TCHAR* OutPath); int _tmain(void) { HRESULT hr; IShellDispatch* pShellDisp; // UNICODE文字を標準出力に正しく表示させるためにロケールを設定 _tsetlocale(LC_ALL, _TEXT("")); CoInitializeEx(0, COINIT_MULTITHREADED); hr = CoCreateInstance(CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pShellDisp)); if (FAILED(hr)) { CoUninitialize(); return 1; } // ZIPファイル 展開先 ExtractZip(pShellDisp, (TCHAR *)(L"C:\\test\\1.zip"), (TCHAR *)(L"C:\\test\\000")); CoUninitialize(); return 0; } BOOL ExtractZip(IShellDispatch* pShellDisp, TCHAR* ZipPath, TCHAR* OutPath) { HRESULT hr; VARIANT vDtcDir; Folder* pOutDtc; // 展開先Folderオブジェクトを作成 VariantInit(&vDtcDir); vDtcDir.vt = VT_BSTR; vDtcDir.bstrVal = SysAllocString(OutPath); hr = pShellDisp->NameSpace(vDtcDir, &pOutDtc); VariantClear(&vDtcDir); if (hr != S_OK) { MessageBox(NULL, TEXT("展開先フォルダーが見つかりませんでした。"), NULL, MB_ICONWARNING); return FALSE; } // ZIPファイルのFolderオブジェクトを作成 VARIANT varZip; Folder* pZipFile; VariantInit(&varZip); varZip.vt = VT_BSTR; varZip.bstrVal = SysAllocString(ZipPath); hr = pShellDisp->NameSpace(varZip, &pZipFile); VariantClear(&varZip); if (hr != S_OK) { pOutDtc->Release(); MessageBox(NULL, TEXT("ZIPファイルが見つかりませんでした。"), NULL, MB_ICONWARNING); return FALSE; } // ZIPファイルの中身を取得 FolderItems* pZipItems; hr = pZipFile->Items(&pZipItems); if (hr != S_OK) { pZipFile->Release(); pOutDtc->Release(); return FALSE; } VARIANT vDisp, vOpt; VariantInit(&vDisp); vDisp.vt = VT_DISPATCH; vDisp.pdispVal = pZipItems; VariantInit(&vOpt); vOpt.vt = VT_I4; vOpt.lVal = 0; //FOF_SILENTを指定すると処理中の経過が表示されなくなります // ZIPファイルの中身を展開先フォルダーにコピー hr = pOutDtc->CopyHere(vDisp, vOpt); if (hr != S_OK) { pZipItems->Release(); pZipFile->Release(); pOutDtc->Release(); MessageBox(NULL, TEXT("展開に失敗しました。"), NULL, MB_ICONWARNING); return FALSE; } pZipItems->Release(); pZipFile->Release(); pOutDtc->Release(); return TRUE; } // プログラムの実行: Ctrl + F5 または [デバッグ] > [デバッグなしで開始] メニュー // プログラムのデバッグ: F5 または [デバッグ] > [デバッグの開始] メニュー // 作業を開始するためのヒント: // 1. ソリューション エクスプローラー ウィンドウを使用してファイルを追加/管理します // 2. チーム エクスプローラー ウィンドウを使用してソース管理に接続します // 3. 出力ウィンドウを使用して、ビルド出力とその他のメッセージを表示します // 4. エラー一覧ウィンドウを使用してエラーを表示します // 5. [プロジェクト] > [新しい項目の追加] と移動して新しいコード ファイルを作成するか、[プロジェクト] > [既存の項目の追加] と移動して既存のコード ファイルをプロジェクトに追加します // 6. 後ほどこのプロジェクトを再び開く場合、[ファイル] > [開く] > [プロジェクト] と移動して .sln ファイルを選択します