
近年の Windows のエクスプローラ上では、JScript ファイルや VBScript ファイル、Windows Script ファイル(それぞれ拡張子 .js、.vbs、.wsf)の上に、他のなにかファイルを、ドラッグ & ドロップできる。
ドロップされると、そのスクリプトファイルがスクリプトエンジンに読み込まれて起動するのだが、このときに、ドロップしたファイルのパス名がコマンドライン引数に渡されている。
コマンドライン引数で、処理対象のファイル名を指定するようなスクリプトの場合、必ずしもコマンドプロンプトを開かずとも処理できるので、慣れると結構便利である。ドロップするという動作が、「このファイルをあげるから処理してね」といったニュアンスを感じるのもいい。
さて、
先に書いたとおり最近利用している Ruby である。
ActiveScriptRuby を利用させてもらっているが、ActiveScriptRuby のインストーラでインストールを済ませただけでは、残念ながら、このスクリプトファイルへのドラッグ & ドロップは使えるようにはならない。ドラッグしてみても左図のとおり無反応でマウスカーソル形状も変化はない。
ところで、ActiveScriptRuby は ActiveX スクリプティングに対応したディストリビューションであり、CScript.exe や WScript.exe といった Windows Script Host でも Ruby スクリプトファイル読み込み・実行が可能である(もっと言えば、HTML Application - .hta や Internet Explorer でも Ruby が使える)。
そこで思いついたのが、JScript ファイルや VBScript ファイルに設定されている、Windows Script Host に処理を委ねるドロップハンドラを、そのまま Ruby スクリプトファイルに対しても設定してやれば、Ruby スクリプトファイルへのドラッグ & ドロップが実現できるのではないか、という案。
それでは早速と、レジストリエディタを開き、拡張子 .js について調べてみる(HKEY_CLASSES_ROOT\.js)。ファイルタイプ名は "JSFile" ということで、続けて JSFile のエントリを探す(HKEY_CLASSES_ROOT\JSFile)。するとその中に HKEY_CLASSES_ROOT\JSFile\ShellEx\DropHandler というシェル拡張のドロップハンドラのエントリが。このエントリには {60254CA5-953B-11CF-8C96-00AA00B8708C} という、おそらくはドロップハンドラの COM CoClass の GUID が記述されている。これをまるごと、Ruby スクリプトファイルについても設定をコピーしてやればいいはずだ。

ActiveScriptRuby のインストーラでは、Ruby スクリプトファイルのエントリは HKEY_CLASSES_ROOT\RubyScriptFile となっているので、この下に ShellEx\DropHandler サブキーを作成して上記 GUID 値を設定。すると見事、Ruby スクリプトファイルへのドラッグ & ドロップができるようになった。もちろん、こうしてドロップしたファイルのパス名は、Ruby スクリプト中、ARGV[0] で取得することができる。
参考までに、上記のレジストリ設定を行うレジストリ登録ファイルを下記に置いておく。Windows XP SP2 の環境で作ったものなので、他の環境では違う設定が必要になるかもしれない点は注意。
http://www.stbbs.net/~junichi/archive/SetupRubyScriptFileDrophandler.reg
などということをやっていたら、Ruby に限らず各種スクリプトファイル用にシェル拡張ドロップハンドラを作成されている方がいらした。下記参照。
Drop on Script - スクリプトファイルのアイコンにドラッグ&ドロップできるようになるフリーソフト
http://homepage3.nifty.com/yamakox/DropOnScript/index.html