Windowsネイディブを操作できるのはやっぱりCygwinだけではなかろうか

昨日の続き。
id:u_1roh氏からのトラックバックにお答え。

それってCygwinじゃないと出来ないのかい?
下記のプログラムがあればCygwinじゃなくても同じことが出来るんじゃないのかな?

まず、個人的には各種Linuxエミュレータ内での話を前提にしていたためにCygwinじゃないと出来ないって表現をしました。

前提での各種Linuxエミュレータの場合、こればCygwin以外のLinuxエミュレータで出来るだろうか。CygwinLinuxエミュレータの中で一番高レイヤー層で仮想化していて、だからこそWindowsネイティブの動作と組み合わせが効くと思っている。比較的高めのレイヤーで仮想化しているcoLinuxでも、Linuxカーネル上で動くようだし、Windowsネイティブに関連付けられた動作をさせるなんて事は出来ないと思う*1
VMware等のPCエミュレータ上のLinuxに至っては完全に無理だろう。

cygstartとShellExecute

実はcygstartコマンドは内部でShellExecuteを使用している。このコマンドを知るまでは自分でソース書いてコンパイルして使っていた。しかし、違うんだ。やっぱり用意されたコマンドの方がいろいろ便利なんだ。

パス補完の違い

Wiindowsアプリに渡すファイルのパスはWindows用のパスである必要がある。ShellExecuteではそこまで補完してくれない。カレントディレクトリのファイルなら良いけど、例えばopen ~/hoge.txt*2とした場合、エラーとなってしまう。私はC言語が達者じゃないのでエラー処理まで書けなくて何のエラーかまでは分からないけど、たぶんファイルが存在しないというエラーだと思う。
その点、cygstartはパスを適切に補完してくれて開く事が出来る。本当にファイルが無ければきちんとエラーも出してくれる。
CygwinパスをWindowsパスに変換するコマンドも用意されているのでopen "`cygpath -wa path/file`"ってやれば出来るし、毎回打つの面倒ならラッパーシェルを書けば良いんだけど...。

各種オプション

man cygstartをやると分かるけれど、幾つかオプションが用意されている。今のところ使う機会は無かったけどw

微妙な挙動の差異

あとはShellExecuteの第二引数の設定の仕方だと思うけど、cygstartは関連付けれたデフォルトの実行ファイルで開くのに対して、ShellExecute(0, "open", ...)だとデフォルトと関係なくopenに関連付けられたもので開く。

ってことで、自分で10行プログラミングするより、用意されたcygstartの方がうまく作られていて便利だ。

*1:使った事がないので"おそらく"の範疇だけど

*2:openをShellExecuteを使った実行ファイルとする