きょうも Windows。
つまり、Windows は Unix じゃないってことなんですが。いい加減 POSIX 準拠な API 用意しろよコノヤロウ。
(DOS の INT 21h はわりと Unix 、というか stdio.h な感じの function call がいっぱいあったよなー、とか思う…)
– 黒いウィンドウ
mingw で GTK なコードをコンパイルして、explorer から実行すると、黒いウィンドウが開いてそこが stdout になるんですが、あまりにかっこ悪いじゃないすか。というわけで、リンクするときに -Wl,–subsystem,windows を付けてみました。消えました。わーい。
– getenv(“PWD”)
mingw とか cygwin の shell から実行するときはこれで current directory がわかるんだけど、ふつうに explorer から実行するとダメみたい。getcwd() 使うべし。
– コマンドプロンプトの escape 文字とか
& は、unix のたいていのシェルでいうところの ; であり、dir & dir とかすると、2度実行される。
ちなみに、; はリスト表現のときのスペースみたいな区切り文字であり、つまり、sh で PATH=/bin:/sbin と書くわけだが、それと同じノリで ; を使う模様。
んで、こういうやつらを escape してやるには、\ (backslash) ではなくて、なんと ^ (hat) を使うんですよ! 信じられません!!
したがって、Cygwin や MinGW で system() を使う場合には、互換性が失われるおそれがあるので要注意です。
– fork() したい
Win32 API には fork() みたいなことをやるのはないんだそうだ。あと、pipe もないらしい。のすけ師匠によれば、cygwin はこのあたりを、かなりすごい仕掛けで解決しているのだそうで、だから遅いとのこと。ほへー。で、MinGW にも fork() はないわけですが。
で、なんで fork() したかったかというと、ブラウザを開くのに
rundll32 url.dll,FileProtocolHandler http://hogehoge.org/
とかしてやれば、デフォルトのブラウザが起動するわけですが、MinGW の system() とかで呼ぶと cmd.exe の黒いウィンドウが出てきてかっこ悪いんですよ。まあ、簡単なプログラムで execvp() つかってみたら、やっぱり黒いウィンドウ開くから、fork() できても意味なかったんですが。
結局のところ、glib に入ってる、g_spawn_command_line_async() というのを使って一発で解決した。これ使うと、エスケープ文字が変なのとか、そういう問題も一気に解決できて、Unix で system() を呼ぶのとほとんど同じノリで Windows でも使えるので、非常にいい感じ。Glib とか GTK とか作ってる人たちは、ほんとすげーっす。頭が下がります。
おかげで、#ifdef とか使った platform specific な記述を減らせました。ばんざーい。
– ldd したい
ldd がないから dll の依存関係がわかんないすよー、と思って困ってたのだけれど、cygwin についてくる cygcheck というプログラムで解決。
cygcheck ./hogehoge.exe
みたいな感じだ。dll の依存関係を recursive に辿って、結果がインデントして表示されるのがおもしろい。
– アイコンつけたい
.exe ファイルにリソースを埋め込むとアイコンとかつけられるわけですが、GNU の linker はそのままじゃリソースファイルを扱うことができないので、windres というプログラムがある模様。これを使うと、リソースファイルから .o ファイルを生成して、これをリンクしてやればいいみたいだ。ふーむ。
で、リソースファイルってどうやって書くんだろう…
今日はそんな感じ。本質的な実装は全然進まなかった気がするが、まあいいか。
おれさま vs Windows
きょうも Windows- fork() したいWin32 API には fork() みたいなことをやるのはないんだそうだ。… cygwin はこのあたりを、かなりすごい仕掛けで解決しているのだそうで、だから- ldd したいldd がないから dll の依存関係がわかんないすよー、と思って困ってたのだけれど、cygwin についてくる cygcheck というプログラムで解決。