スポンサーサイト

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

ブログ引っ越しました

この度、ブログを引越しすることになりました。

新しいブログのアドレスは http://tablacus.hatenablog.com/ です。

今後ともよろしくお願いします。
 
スポンサーサイト

ファイル処理の調整(X-Finder/Tablacus Explorer)

今回のファイル処理の調整では、古いAPIのSHFileOperationの代わりに後継のインターフェイスであるIFileOperationが使えれば使う様にしました。

サイズの巨大なファイルやネットワークを使う場合に設計が古いSHFileOperationでは無駄にキャッシュをしたりして遅くなってしまっていたのが、IFileOperationでは解消されて結構速くなるとのことです。

とはいってもSHFileOperationとIFileOperationでは使い方が結構違うので、X-Finder/Tablacus ExplorerではIFileOperationでSHFileOperationをエミュレートする関数を作成して置き換えることにしました。

Tablacus Explorerのソース(TE.cpp)ではteSHFileOperationというのがその関数になります。

完璧なエミュレートという訳ではないですが、手軽に差し替えできますし、MIT ライセンスなので勝手に使って頂いて構いません。

※戻り値が成功が0(S_OK)というの以外は違っていたり、ワイルドカードやFOF_WANTMAPPINGHANDLEを指定した場合はAPIのSHFileOperationを実行します。

X-FinderでもDelphi 6でほとんど同じような関数を作成しています。

工夫している点としてはFO_MOVEでFOF_MULTIDESTFILESの際に同一フォルダであれば、移動ではなく名前の変更で処理している所です。そのため、X-FinderのNumbering:を使った連番化で、今までは元に戻すの表示が「元に戻す - 移動」だったのが「元に戻す - 名前の変更」になりました。
 

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

Delphi 6 Personal EditionにTnt Unicode Controlsを

GitHubにTnt Unicode Controlsのソースがあり、ライセンスが著作権を保持するならば、ソース形の再配布および使用は、修正の有無にかかわらず、許されますとのことだったので、Delphi 6 Personal Editionで動くようにDelphi 6 Personal Editionに無いコントロールを使わないように調整しました。

https://github.com/tablacus/TntUnicode
 

X-Finderがavast!に誤検知でブロックされダウンロードできない場合の対処方法

2014年8月18日位からavast!がX-Finderを誤検知でブロックしてしまう問題が発生しています。
avast20.png

様々なアンチウイルスソフトで徹底的に検査するVirusTotalで調べてみましたが、全く問題が無いのでavast!の誤検知だと思います。なんとVirusTotalのavast!も問題なし……

X-Finder 12のVirusTotalの結果
X-Finder 12-0-22のVirusTotalの結果

avast!のウェブシールドの除外設定にX-FinderのサイトかVectorのサイトを追加すると指定したサイトからはダウンロードできるようになるので設定してみます。

avast!を起動し、メニューの「設定」をクリック
avast5.png

「ウェブシールド」の歯車アイコンをクリック
avast21.png

「スキャンからの除外」をクリック
avast22.png

「除外するURL」にX-Finderの公式サイトを信用する場合は「www.eonet.ne.jp/~gakana/*」を入力
国内最大級の フリーソフト ダウンロードサイトであるベクターを信用する場合は「ftp.vector.co.jp/*」を入力
avast23.png

入力したら「OK」を押せば完了です。
avast24.png

実行する場合も「ファイルシステムシールド」でブロックされるのでX-Finderがavast!に誤検知された場合の対処方法でファイルシステムシールドの除外設定も行って下さい。 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。