タブファイラー開発ブログ

Tablacus ExplorerやX-Finderの作者のブログ

統合アーカイバ アドオン - Tablacus Explorer

Tablacus Explorerで統合アーカイバプロジェクトのライブラリが使用できるようになりました。

http://www.madobe.net/archiver/

TE64.exeの場合は64bit版、TE32.exeの場合は32ビット版を使用します。

tablacus.hatenablog.com

アドオンの「統合アーカイバ」をインストールしたら、使用するライブラリの設定をオプション画面から行います。

f:id:tablacus:20151124230412p:plain

左下のいくつかのライブラリのテンプレートがあるので選んで追加を押して下さい。

 

名前の先頭の英字部分はライブラリのAPIの基本名です。英文字以降は好きな名前にできます。 

パスの「*」はTE64.exeの場合は「64」に、TE32.exeの場合は「32」になります。dllの場所がshell32等パスの通っている場所でない場合はフルパスで指定します。

※TE64.exeで対象のdllが無く、UNBYPASS.DLLが対応しているライブラリの場合はUNBYPASS.DLLを自動的に使用します。

フィルタは対応する拡張子を指定します。

展開は展開(解凍)するコマンドラインを書きます。展開する機能がない場合は空欄にします。

追加は追加するコマンドラインを書きます。追加する機能がない場合は空欄にします。

削除は削除するコマンドラインを書きます。削除する機能がない場合は空欄にします。

コマンドラインの「%archive%」は対象のアーカイブファイル名、「%path%」は基準ディレクトリ、「%items%」は対象の項目名になります。

64ビット版 統合アーカイバプロジェクト (64bit Common Archiver Library)

64ビットの統合アーカイバプロジェクトのライブラリを調べてみました。


■7-zip32.dll/7-zip64.dll/7z.dll文字化け対策版

http://www16.atpages.jp/rayna/7-zip32_ungarbled/

7z.dll対応版もあり、こちらは7z.dllの対応しているすべての書庫に対応。

rarやlzh等も解凍でき、いろんな書庫に対応できる。


■7-zip64.dll 私家版
■tar64.dll 私家版

http://homepage1.nifty.com/Ayakawa/soft/index.html

7-zip64は7z、zipの解凍、圧縮が可能
tar64はtarの解凍、圧縮が可能


■LMZIP32/64.DLL

http://homepage2.nifty.com/NYanagi/LMZIP32.html

zipの解凍、圧縮が可能


■UNBYPASS.DLL
■unzzip.dll
■7zca.dll

http://homepage1.nifty.com/toro/slplugin.html

UNBYPASSでは32ビット版の統合アーカイバライブラリがあれば、バイパスさせて使用できるようになる。
64ビット版が無くても64ビット版のUnlha32.dllがあればlzhの圧縮ができるようになる。

unzzipはzipの解凍が可能、7zcaは7z、zip以外に7z.dllの対応しているすべての書庫の解凍が可能。
rarやlzh等も解凍でき、いろんな書庫に対応できる。


■Unrar64j
https://github.com/rururutan/unrar32/releases

rarの解凍が可能

C/Migemo - Tablacus Explorer

C言語で作成されたC/Migemoに対応したアドオンができました。

JavaScript版のMigemoより大きな辞書を持っているので、物足りなかった方や他のソフトでC/Migemoを使っている方におすすめです。

反面、辞書が大きいのでJavaScript版に比べて使用メモリは多くなります。

JavaScript版のMigemoとC/Migemo版のMigemoアドオンを両方とも有効にしても、どちらか片方は動きません。使わない方は無効化して下さい。

f:id:tablacus:20151026233125p:plain

アドオンのオプションを開いたら、Get C/Migemo...を押すと

www.kaoriya.net

C/Migemoを配布しているページをブラウザで開きます。

TE32を使っている方はmigemo.dll (32bit)に32ビット版のmigemo.dllを、TE64を使っている方はmigemo.dll (64bit)にダウンロードしてきて解凍したdllファイルを指定します。

辞書ファイルは「migemo-dict」を指定し、文字コードUTF-8の場合は「UTF-8(CP65001)」ボタンを、SHIFT_JISの場合は「SHIFT_JIS(CP932)」押して下さい。

設定が完了したら、「最新の情報に更新」を押すと辞書が更新してテストできるようになります。

 

※フィルタ バーや正規表現/Migemoインクリメンタルサーチ、EverythingでMigemoを使う設定はJavaScript版と共通です。

 

C/Migemoの作者のKoRoN様、便利なライブラリの公開ありがとうございます。

EverythingでもMigemoを使えるようになりました。 - Tablacus Explorer

EverythingアドオンでもMigemoを使えるようになりました。

前回のブログで紹介したようにMigemoアドオンをインストールしてから…

Everythingアドオンのオプションの「Regular Expression/Migemo」にチェックして下さい。

f:id:tablacus:20151022230619p:plain

フィルターバーと同じ要領ですね。

 

前回書き忘れた 正規表現/Migemo インクリメンタルサーチ の機能

インクリメンタルサーチ中に「PGDN」キーで当てはまる次の項目に移動し、「PGUP」キーで当てはまる前の項目に移動します。

 

ローマ字で日本語検索 Migemo - Tablacus Explorer

Migemo: ローマ字のまま日本語をインクリメンタル検索 がTablacus Explorerでも使えるようになりました。

Tablacus Explorerでは JavaScript/Migemo のJavaScriptで実装したMigemoエンジンを使用しています。

 

インストール方法

まず、アドオンの「Migemo」をインストールします。

f:id:tablacus:20151021234446p:plain

次にMigemoのオプションを開き、

f:id:tablacus:20151021234509p:plain

「インストール」を押せば、上記のサイトからMigemoエンジンと辞書をダウンロードしてインストールできます。

f:id:tablacus:20151021234526p:plain

テストの場所でローマ字入力をして、Regular Expressionの場所に日本語を含む正規表現が表示されればOKです。

f:id:tablacus:20151021234720p:plain

Migemoでリスト上での検索を行う場合は、「正規表現/Migemo インクリメンタルサーチ」をインストールして下さい。

f:id:tablacus:20151021234741p:plain

Migemoでフィルタリングしたい場合は、フィルターバー(Innerフィルターバー)のオプションに入り

f:id:tablacus:20151021234809p:plain

「Regular Expression/Migemo」にチェックして下さい。

f:id:tablacus:20151021234938p:plain

日本語のファイルを扱う際に便利ですね。

Migemoの原作者の高林様、JavaScript版の作者のふるかわ様、便利な機能の公開ありがとうございます。

フォルダ ツリーの自動更新の強化2 - INameSpaceTreeControl

前回のふたつ目はAs/Rの作者さんにこちらでOS安定稼動を考えると良くないとアドバイスを頂いたので、Tablacus Explorer 15.10.5から別の方法で実装してみました。

今回の実装は

SHChangeNotifyDeregisterでInterruptレベルの通知をキャッチして………

ツリーに項目を追加する場合は INameSpaceTreeControl::SetItemState(IShellItem *, NSTCIS_EXPANDED, NSTCIS_EXPANDED) で追加する。

ツリーから項目を削除等する場合は NamespaceTreeControl のウインドウに WM_USER + 1 でメッセージを横流しする。

追加の方はまだ良いとして、削除などの方はOSのバージョンアップ等で仕様が変わったらアウトなんですが、SHChangeNotifyで投げるのに比べたら他のアプリに影響しないのでマシかなと。

 ついでに、みもふたもない言い方になりますが、そもそもDOSコマンドのmkdirとか「シェル通知を送らないことで高速化している」という側面もあるので、そっとしておいてあげた方が良いんじゃね?という考え方もあります。

エクスプローラーはmkdir等も対応してて自動的に追加されたりするので、「エクスプローラーはちゃんと動くんですが………」等と言われちゃいがちなのでなんとかしたいなと………

 

機会がありましたら、一緒にご飯したいですね。

フォルダ ツリーの自動更新の強化 - INameSpaceTreeControl

Windows Vista以降の場合、X-Finderのシステム互換やTablacus Explorerのフォルダ ツリーではINameSpaceTreeControlというVistaで追加されたツリーコントロールを使ってフォルダ ツリーを表示しています。

このツリーコントロールは自動でいろいろやってくれて便利なんですが、すでに展開しているフォルダで新規フォルダを作成しても追加されない場合があります。
例えば、コマンドラインの「mkdir フォルダ」としてフォルダを追加しても素のINameSpaceTreeControlではフォルダが追加されません。

f:id:tablacus:20150906230158p:plain

いろいろ試してみたところ、自動的に更新させる方法を2つ発見しました。

1.Windows 7で追加されたインターフェイスのINameSpaceTreeControl2のSetControlStyle2でNSTCS2_INTERRUPTNOTIFICATIONSを指定

INameSpaceTreeControl2 *pNSTC2;
if SUCCEEDED(m_pNameSpaceTreeControl->QueryInterface(IID_PPV_ARGS(&pNSTC2))) {
 pNSTC2->SetControlStyle2(NSTCS2_INTERRUPTNOTIFICATIONS, NSTCS2_INTERRUPTNOTIFICATIONS);
 pNSTC2->Release();

これだけで、Windows 7以降ではフォルダが追加されるようになりました。

ただ、Tablacus Explorerではこの方法は使わずコメントアウトしています。

何故かと言うと、私の環境では更新通知されすぎるのか、ちょっとしたファイル変更の度に更新してツリーが重くなってしまったからです。

TablacusExplorer/TE.cpp at master · tablacus/TablacusExplorer · GitHub


2.SHChangeNotifyDeregisterで通知をキャッチしてSHChangeNotifyで投げる

INameSpaceTreeControlではInterruptレベルの通知はキャッチしないが、Shellレベルの通知はキャッチしているようなので、SHChangeNotifyDeregisterでInterruptレベルの通知をキャッチしてSHChangeNotifyでShellレベルで投げる方法を考えました。

※SHChangeNotifyRegister定義でフォルダ関連のInterruptレベルの通知をキャッチ

Addons.TreeView.uRegisterId = api.SHChangeNotifyRegister(te.hwnd, SHCNRF_InterruptLevel | SHCNRF_NewDelivery, SHCNE_MKDIR | SHCNE_DRIVEREMOVED | SHCNE_MEDIAREMOVED | SHCNE_NETUNSHARE | SHCNE_RENAMEFOLDER | SHCNE_RMDIR | SHCNE_SERVERDISCONNECT | SHCNE_UPDATEDIR, Addons.TreeView.WM, ssfDESKTOP, true);

※通知をキャッチしてSHChangeNotifyでそのまま投げる

AddEvent("AppMessage", function (Ctrl, hwnd, msg, wParam, lParam)
{
 if (msg == Addons.TreeView.WM) {
  var pidls = {};
  var hLock = api.SHChangeNotification_Lock(wParam, lParam, pidls);
  if (hLock) {
   api.SHChangeNotify(pidls.lEvent, SHCNF_IDLIST, pidls[0], pidls[1]);
   api.SHChangeNotification_Unlock(hLock);
  }
  return S_OK;
 }
});

上記をTreeviewアドオンのscript.jsで行っています。

TablacusExplorerAddons/script.js at master · tablacus/TablacusExplorerAddons · GitHub

なおこの方法も副作用があります。SHChangeNotifyで投げているのでTablacus Explorerだけでなく他のアプリにも影響してしまいます。

例えば、Tablacus Explorerとツリーアドオン使用時はINameSpaceTreeControlを使っていると思われるAs/Rも、フォルダの追加等で自動的に更新されるようになります。

本当は自分だけ更新する方法があれば他のソフトへの悪影響の心配もなく良いのですが…