スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
 

Windows8でzipfldr.dllを使った解凍

PPxのTOROさんが昔、TwitterでWindows8でzipfldr.dllからIPersistFileが使えなくなったと書かれていました。


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でデスクトップのアイコンが表示できなくなると教えてもらったのでその辺りも調整しました。
スポンサーサイト
 

コメント

コメントの投稿

  • URL
  • コメント内容
  • password
  • 秘密
  • 管理者にだけ表示を許可する

トラックバック

トラックバックURL: http://gakana.blog34.fc2.com/tb.php/92-2729ccf3
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。