Gauche > Archives > 2010/11/22

2010/11/22 04:26:15 UTCshiro
#
sf.netのbug trackerのspamが止まないので、ポストをログインユーザのみに限定した。
#
もともとあっちは滅多に見ないので、バグ報告はMLかwilikiかchatonでお願いします。
2010/11/22 05:35:56 UTCshiro
#
MinGW版GaucheのインストーラにGauche-glもつけようと思うのだけれど、WindowsってOpenGLのサポートは別途入れないとだめなんだったっけ。glu32とかopengl32とかのdllはどこのを見てるんだろ。
#
MinGWにはインポートライブラリ (*.a) しか無いような。
#
Windows\System32\opengl32.dllか。これはWindowsに元々あるものなのかな。
2010/11/22 05:54:36 UTCshiro
#
もひとつ。goshを非コンソールアプリとしてビルドすればGauche-glのスクリプトを余分なコンソールを出さずにダブルクリックで実行できたんだけど、プログラムから標準出力に何か書こうとすると落ちる。これは非コンソールアプリではstdoutがそもそもopenされてないから、ってことかな。
#
それなら強制的にNUL開いてdupする等してとりあえず動かすことはできるかな。できれば出力した時点で自前のコンソール開くとかやりたいけど。
2010/11/22 06:39:43 UTCshiro
#
単純にfd=0, 1, 2 についてopenしてやるだけで良かった。出力が見られないのはいまいちだけどSchemeレイヤで何とかできるかな。
#
さて、後は、コンソール版goshと非コンソール版goshのどちらをデフォルトで見せるべきか。コマンドラインとかで切り替えられるといいんだけど、リンク時オプションが違うってことはそうもいかない。
2010/11/22 06:59:45 UTCeyasuyuki@twitter
#
VC++をインストールするとコピーされるっぽいです。>opengl32.dll http://bit.ly/9sxqwb
2010/11/22 07:01:52 UTCshiro
#
なるほど。ってことはデフォルトではついてないのかな。ランタイムだけ別途提供されてるかな。
2010/11/22 07:08:42 UTCshiro
#
openglのwikiだと、デフォルトでついてくるようなことが書いてある。ビデオカードのドライバを入れるとアクセラレーテッドなドライバが別途入ると。 http://www.opengl.org/wiki/Getting_started
#
サポートされるOpenGLバージョンはドライバによって違うのかな。デフォルトではXPまでが1.1、Vistaから1.4。ベンダのドライバを入れるともっと上のバージョンが使えるんだろうか。
2010/11/22 07:31:23 UTCshiro
#
Schemeスクリプトをダブルクリックで起動することを考えると、*.scmは非コンソールアプリに関連づけられていた方が良いような気はする。何らかの出力をするアプリでも終了したらコンソールアプリの窓は閉じちゃうからダブルクリック起動でコンソールを出す意味はあまりない。敢えてやるなら、バイナリは非コンソールアプリにしといて、何らかの出力があったらAllocConsoleして自力で書き出す。
#
シェルからとか、EmacsからREPLを使う人向けにgosh.exeはコンソールアプリとして残し、関連付け用に別バイナリもインストールする。ってのでいけるかな。
2010/11/22 08:04:57 UTCshiro
#
リンクオプションが違うとしても、コードは共通で(コンパイルオプションは同じで)コンソール版と非コンソール版を切り替えられると良いのだが、そのためには実行時にコンソールアプリかどうかを知る必要がある。
#
一番簡単そうなのはAttachConsole(ATTACH_PARENT_PROCESS)を使う方法なのだが、AttachConsoleってXP以降か。一応mingw版GaucheはWin2000以降を対象ってことにしてたんだがどうしようかなあ。
#
AllocConsoleがfailするかどうかで調べる…と一瞬コンソール窓が出てしまうんだなあ。むむむ。
2010/11/22 08:14:59 UTCeyasuyuki@twitter
#
もうXP以降でいいんじゃないでしょうか。XPにしてからがサポート終了ですよね。
2010/11/22 08:18:45 UTCshiro
#
まあそうだなあ。win2000で走らせる需要ってどのくらいあるだろう。ちなみにうちにはwin2000とwinXP機が一台づつある (古いノート)。普段はlinuxなのであまり関係ないけど。
2010/11/22 10:08:25 UTCshiro
#
AllocConsole()してGetStdHandle()して_open_osfhandle()でファイルディスクリプタを得る、という手順がぐぐるとそこらじゅうで見つかるのだけど、なぜかうまくいかない (_open_osfhandleが-1を返す。GetStdHandleは有効なハンドルを返してるっぽいのに)。
#
_open_osfhandleのエラー原因はerrnoでわかるのかな。MSのリファレンスページには失敗したら-1を返すとしか書いてない。相変わらずCRTのライブラリは冷遇されてるなあ。
2010/11/22 10:22:38 UTC齊藤
#
実行時に自身がコンソール版かどうかを判別するには GetModuleHandle の値に 0xBC を足した番地にある値が 03 か否かで判別できる (02ならGUI版) はず。
#
_IMAGE_NT_HEADERS とかいう構造体が PE ヘッダの構造を表しているらしいので、マジックナンバーでなくこの周辺のマクロ定義とかを使うべきなのかな。
2010/11/22 10:27:56 UTCshiro
#
なるほど自分自身のバイナリのフラグを読むのか。
2010/11/22 10:36:15 UTCshiro
#
GetModuleHandleの値がモジュールヘッダへのポインタであることは保証されてるのかな。公式ドキュメントはopaqueな値として扱って欲しそうだが…
2010/11/22 10:37:23 UTC齊藤
#
まぁそうなんですけどねぇ。
#
現在の挙動に依存しているものが結構あるみたいなので、ドキュメントに書いてなかったとしても変えるに変えられないとは思うんですが。
2010/11/22 10:39:36 UTCshiro
#
ああ、そういう互換性を保つことについてはMSは律儀だから大丈夫かな。
2010/11/22 10:49:41 UTCshiro
#
あーもう。あんまり深入りせずに切り上げたいんだけどランダムに隠された情報が多くてついつい色々調べちゃって人生を無駄にした気分になるのがWindowsプログラミング。
2010/11/22 20:44:16 UTCとおる。
#
WSH はウィンドウ版とコマンドライン版と別のプログラムになってますよね。ウィンドウ版は wscript で、標準出力はたしか、ダイアログボックスに出てきたような。で、アイコンをダブルクリックするとウィンドウ版が開きます。
2010/11/22 22:56:06 UTCshiro
#
ひとつのバイナリで実行時に切り替えるってのを試したんですがうまくいかなかったんで、結局コンソール版と非コンソール版を別に用意しました。gosh.exeは従来どおりコンソール版。非コンソール版としてgish.exeというのが作られて、*.scmファイルはそちらに関連づけられます。ダブルクリックすると非コンソール版が走ります。名前は仮。
#
夜中には「goshとgishでいいや」って気がしてたんだけど日が登ってから考えてみるとあんまり良い名前じゃないなあ。うまいアナグラムが思いつかない。もうちょっと平凡な名前の方がいいかもな。
2010/11/22 23:56:41 UTC齊藤
#
伝統的 (?) には非コンソール版は w を付けますよね。 rubyw とか pythonw とか。