Windows8でzipfldr.dllを使った解凍
PPxのTOROさんが昔、TwitterでWindows8でzipfldr.dllからIPersistFileが使えなくなったと書かれていました。
テストの為にWindows 8でZIPフォルダ機能無効化をするのにWindows 8の圧縮フォルダ機能を無効化する方法を参考にさせていただきました。 TOROさんの方は今はIDataObjectを使う方法で対処しているんだそうです。 それと、今回のTablacus Explorer 14.9.7ではEgg ExplorerのAE85さんにFWF_NOICONSを使うとWindows 7でデスクトップのアイコンが表示できなくなると教えてもらったのでその辺りも調整しました。
Windows8 で PPv の zipfldr.dll 経由 zip 内表示ができなくなった。IPersistFileが使えなくなったようだ orz
— TORO (@toroidj) 2012, 8月 29
Tablacus Explorerでもスクリプト(IShellDispatch)を使ったZIPの解凍が行えない場合にzipfldr.dllからIStorageを使って解凍していたので、今回調べてみました。
基本的にはEternalWindowsさんのZIP / IStorageによる展開にzipfldr.dllをLoadLibraryする様な感じで作っています。
詳しくは前にブログに書いたZIPフォルダ機能無効化でも解凍する(Tablacus Explorer)ですね。
確かにWindows 8ではzipfldr.dllから取り出したIStorageからはIPersistFileが使えなくなっていました。IPersistFileの代わりにIInitializeWithFileが使えないかとか、SHCreateStreamOnFileExでIStreamを作ってIStorageに使えないかとか、StgOpenStorageExが使えないとかやっていたら、なんとかIPersistFolderが使えました。
IPersistFile *pPF; IPersistFolder *pPF2; if SUCCEEDED(pStorage->QueryInterface(IID_PPV_ARGS(&pPF))) { if SUCCEEDED(pPF->Load(vZip.bstrVal, STGM_READ)) { *plResult = teExtract(pStorage, vDest.bstrVal); } pPF->Release(); } else if SUCCEEDED(pStorage->QueryInterface(IID_PPV_ARGS(&pPF2))) { LPITEMIDLIST pidl = teILCreateFromPath(vZip.bstrVal); if (pidl) { if SUCCEEDED(pPF2->Initialize(pidl)) { *plResult = teExtract(pStorage, vDest.bstrVal); } ::CoTaskMemFree(pidl); } pPF2->Release(); }上記のコードのようにIPersistFileが取得できれば、IPersistFile::Load、ダメならIPersistFolderを取得し、zipのパスをLPITEMIDLISTに変換しIPersistFolder::Initializeを使いました。 詳しくはTablacus Exploerのソースをご覧ください。
テストの為にWindows 8でZIPフォルダ機能無効化をするのにWindows 8の圧縮フォルダ機能を無効化する方法を参考にさせていただきました。 TOROさんの方は今はIDataObjectを使う方法で対処しているんだそうです。 それと、今回のTablacus Explorer 14.9.7ではEgg ExplorerのAE85さんにFWF_NOICONSを使うとWindows 7でデスクトップのアイコンが表示できなくなると教えてもらったのでその辺りも調整しました。