壊れたメガネ

ホッチキスの達人の意識の高いブログ。

Gorilla - Windows 版の開発(メモ)

Gorilla Windows 版の開発やってます。 Windows でのプログラミングは初めてなのでいろいろ手間取ってます。
このエントリは Windows の開発環境を整える際にはまったところや、参考にしたウェブサイトなどを現在進行形でまとめている自身用のメモです。

PHP 本体と拡張の Windows ビルド

神エントリです。ありがたや。
PHP のバージョンはこのエントリで紹介されているものと同じ 5.3.8 を用いていました。その環境下で大体以下のようなことをやると Windows の CRT (C Runtime) Warning が起きていました。

char *device, mode;
int serial_port_fd, flags;
php_stream *stream;

_sopen_s(&serial_port_fd, device, flags, _SH_DENYNO, _S_IREAD|_S_IWRITE);
stream = php_stream_fopen_from_fd(serial_port_fd, mode, NULL);

php_stream_fopen_from_fd 内部で _get_osfhandle(serial_port_fd) がコールされるのですがこの時に CRT Warning が起きていました。 _sopen_s() のオプションがまずいのかとか、 CreateFile() から _open_osfhandle() しなきゃいけないのかとか、いろいろ試してみましたが結局 Warning は取れず、原因もわかりませんでした。なさけない。。
ググってみると、 PHP :: Bug #54563 :: invalid crt parameters on stream_select という似たようなエラーが出るというバグレポートが真っ先に出てきて、

I have the same issue with Windows Server 2008 R2, PHP 5.3.8.

とあったので「これは!」と思い、 old stable の 5.3.18 を用いてみると CRT Warning が消えました。という感じで 5.3.8 固有のバグと決めつけてめでたしめでたし。

いや、めでたくありません。デバッグ力低すぎて情けない。これはもう少し時間とれた時にリベンジしたい。というか、このエラーがでないバージョンとの diff 見るという手もあるんだけど、それは次リベンジした時の答え合わせなのです。

ちなみに configure オプションは PHP 拡張のビルドが目的なので以下の様に必要最小限にしています。

configure --disable-all --enable-cli --enable-json

(json は動作確認する際に必要なのでつけています)

このエントリでは、PHP 拡張のバイナリ dll に埋め込まれる build id の一部、 'compiler id' を変更する方法に言及しています。この build id は PHP 本体のバイナリにも埋め込まれていて、両方の build id が一致していないと PHP 拡張をロードできません。

--disable-zts フラグをつけてコンパイルした NTSPHP 環境下で拡張をビルドしても何故か TS になってしまうという事が起きています(現在進行形です)。この問題は今はほったらかしています。 Windows のバイナリを配布する段になってこの方法を試してみます。(ひょっとしてこれも 5.3.8 だったのがいけないとか?そうだったらうれしいな。)

Windows シリアルポートプログラミング サンプルプログラム

ほんとに助かります。正しく垂涎(^p^)

前者は DCB 構造体の詳細な説明で、後者は DCB 構造体を用いたフロー制御の方法を解説しています。

Windows scripting

プログラミングは Ubuntu で、ビルドは Ubuntu 、 Windows で、とやってます。そのためにスクリプト書きましたが bat 力低すぎて・・・ WinSCP のスクリプトはちょっと便利な気がします。しかし bat で scripting は辛い。 JScript のリファレンス本欲しいなぁ。