Open Cygwin Window Here
UNIX 使いのための VBScript と C#
書誌
| text | 唯野 |
| author | 吉田昌英 |
| publisher | アスキー |
| year | 『UNIX Magazine 2004.12』p.83-97 |
履歴
| 2004.11.18 | 読了 |
| 2004.11.29 | 公開 |
| 2004.11.30 | 修正 |
感想
エクスプローラの右クリックメニューからカレントディレクトリで Cygwin を起動する記事。そのために PowerToys for Windows XP に含まれる CmdHere を最初の手がかりとして、レジストリの操作、VBScript による CygTerm の起動、C# によるシェル拡張を紹介している。ただ、私としては前者は Perl、後者は C++ でいいと思っているので、実装の概略のみをまとめた。
また、感想としては確かに有用な記事だと思うが、UNIX の雑誌が特集にする類のものかと考えてみると少々疑問が残る。まあ、それだけユニマガも柔軟になったということなのだろうか ?
抄録
84/85
Cygwin の bin ディレクトリにパスが通っていれば、PowerToys の CmdHere で開いたディレクトリから bash を起動できる。但し、この場合にはエスケープシーケンスの解釈などで Cygwin 上の端末に比べ機能的に劣る。
85
CmdHere の実体はレジストリで HKEY_CLASSES_ROOT\Directory\shell\cmd の値「Open Command Window Here」のサブキー command の値「cmd.exe /k "cd %L"」にある。%L は選択されたディレクトリのパスを示している。
85-87
日本語を通した上で Cygwin のシェルを動かせる端末として kterm、漢字パッチを当てた rxvt、Cygterm (TeraTerm の亜種)がある。ここでは CygTerm での起動を目指すが、CygTerm にはコマンドライン引数でカレントディレクトリを渡せないので、カレントディレクトリへ移動してから CygTerm を起動する必要がある。
しかし、レジストリからバッチファイルを呼び出す方法では、CygTerm の起動されている間、バッチファイルのコマンドプロンプトも開いたままになる。但し、これはバッチファイルではなくスクリプト言語などから CygTerm を呼び出せばコマンドプロンプトを開かずに済ませることができる。同様にディスクドライブの右クリックメニューから同じ処理を行わせたい場合には HKEY_CLASSES_ROOT\Drive\shell 以下に同じような設定をすればよい。
// バッチファイルを用いた場合 [レジストリ] キー : HKEY_CLASSES_ROOT\Directory\shell\cygwin\command 値 : C:\cygwin\open-cygwin-window-here.bat "%L" [バッチファイル] chdir %1 "C:\Program Files\cygterm\cygterm.exe"
なお、cygterm.cfg で「SHELL = /bin/bash --login -i」などと --login オプションのある場合は、/etc/profile が読み込まれるが、/etc/profile は最後に「cd "$HOME"」があるので、これを削除しておく必要がある。
88-89
以上で、CmdHere 相当の機能は可能になったが、エクスプローラの右ペイン(ディレクトリの中身の表示部分)の右クリックメニューに対して同様の処理を行おうとすると、シェル拡張(shell extension)を用いなければならない。すると、この変更はエクスプローラのファイルメニュー及びデスクトップ上の右クリックメニューに対しても反映される。
89-91
シェル拡張は具体的に HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers のサブキーとして登録される。このキーは規定の値が COM オブジェクトの CLSID (CLaSsIDentifier、Win32 API である CoCreateGuid() が返す 16bit 値、GUID : Globally Unique IDentifier の一種)なので、エクスプローラより登録されている CLSID の指す COM オブジェクトが呼び出されることにより、その COM オブジェクトに実装されている処理が実行されるかたちとなっている。
これをもう少し詳しく説明すると、エクスプローラは ContextMenuHandlers の CLSID を元に HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{<em>CLSID</em>} の InprocServer32 サブキーに登録されている COM オブジェクトのクラスが実装された DLL を取得し、そのコードを呼び出している。但し、これが .NET Framework によって実装されたクラスの場合には、CLR (Common Language Runtime)の実体である mscoree.dll が全てのエントリポイントとなるため、CLR による該当クラスが .NET アセンブリ(Global Assembly Cache)のどれに該当するか更に判別している分、より手間がかかっている。
この記事ではシェル拡張を実現する COM オブジェクトの実装言語として .NET Framework さえあれば利用できる C# を用いている。C++ の場合には VC に含まれる ATL が必要となり、フリーの VisualC++ 2003 Toolkit のみでは実現できないためとしている。
全文を読まれる場合はログインしてください
