Programming on Windows95

私達の周囲では、UNIXが主流であり、むしろWindowsでプログラムを書ける 人があまりいません(それ以前にプログラムを書く奴が少なくなってはいるが)。 別にWindowsのプログラムが書けなくても困りはしないのですが、最近 またゲームでも作ってみんべえかと思い始めていて、Windows95でもプログラム を書ける体になってみようかと思い立ちました。折角だからメモを残して おきましょう。

題して

Windowsが嫌いな人のためのWin32プログラミング

では始めます。 このメモはあくまで私の覚え書き的メモなので、文章自体や 構成については全く神経を使っていません。だから無茶苦茶読みにくいです。

ところで、この内容をもとに昨年C-Magazineに記事を書かせていただきました。 本来なら、その後も継続して新しい情報をお伝えしていきたいのですが、 もう1年以上も更新が止まっています。したがって、このページの内容は 非常に古いものばかりです。ごめんなさい。


[1. 準備編]

なにはともあれ、環境をととのえなければなりません。幸いにして世間には いろいろな情報がころがっています。サーチエンジンで調べたところ 便利なリンク集 が見付かりました。必要なものだけを以下にまとめます。
tcsh
最初の敵はcommand.comです。X68000を使っていたころにはfishという tcshに良く似たshellをつかっていました。DOSにもtcshっぽいのがあったはず だよな、と探したらありました。というわけで tcshだ。 しかし.tcshrcをc:\windows\におかなければならないのがいまいち納得 いかん。
unix like tools
UnixToolsがありますが、後述のgnu-win32の物を使うのが手っ取り早いかも。
mule
いろいろなところ( その1, その2, その3) に情報やアーカイブがあるので、適当に持って行って インストールすればよいです。
vi
vim
perl
せっかくだから日本語perlをいれておきましょう。日本語perlの インストールにはperlも必要です。この二つのファイル( 日本語perl, perl )をgetすれば 大丈夫です。まずperlをインストールして、次にjperlをインストールします。 両者とも入手したexeファイルを実行するだけです。
もちろんこれだけでは済みません。壁紙を替えてみたり、ウインドウの色を 替えてみたり、アイコンを替えて みたり別のWindowSystemっぽくしてみたりしましょう。

[2. コンパイラ選び]

さてCコンパイラ選びです。良く分からないのでソフトウェア売場を 眺めてみたら次のものを売っていました。 あ"〜、どれが良いのかよくわからん。
とりあえず周囲にVisual C++ version 4.0が転がっていたのでinstallして tutorialをやってみました。確かに簡単にいろいろ作れてしまってこれは これで便利。付属のマニュアルは最悪の出来でしたけど(なんか出来の良い教科書 を真似しようとしたものの書いた人間の能力不足で大失敗って感じ)。 ただ、コンピュータのことほとんど理解していなくても、一応それっぽいものが 作れてしまいそうで、なんか複雑な心境です。果たしてこんなことでちゃんとした エンジニアは育つのだろうか。……

それはさておき、まあ便利には便利だし買ってみようかと店に向かったところ、 なんと種類があるではありませんか。Professional EditionとLearning Edition。 どっちを買えばいいんだ?!。パッケージを眺めても違いが分かりません。 Learning Editionの方なら(AcademicPriceで)1万円台なので買ってもいいかなって感じです。 うーんLeaning Editionでいいのかな〜いいのかな〜と思ったものの不安だったので よくよく調べたら、「Leaning Editionはオプティマイザが ついていなくて、コンパイルしたバイナリを販売できない」とのことです。 うーん、あんまり嬉しくないからやっぱりProfessional Editionにしようと 思ったのですが、こっちは3万円以上します。うー。うー。だったらMicrosoftに 金払うよりはBorlandかWatcomに払った方がいい。

ちょっとまて、gccはないのか?

はい、ありました。便利な世の中ですね。 こちら にいろいろ情報があります。 まとめると次のようになるみたいです。

そうそう、書き忘れていましたけど、Windows95でプログラムを書きたいと 思った目的は、単にゲームを作りたいからです。だからとりあえずDirectXが 利用できればそれでよくて、あと多少面倒なコーディングが必要でも それはあんまり気になりません。 というわけで、sygwin32とmingw32をベースにして開発環境を作ってみることに しました。

[3. gccのインストール]

一連の作業はmingw32のreadme.txtに書いてある内容をそのまま実行したものです。readme.txtにも 目を通すことを推奨します。 次の二つのファイルを持って来ます まずCygwin32をインストールします。といっても取ってきたcdk.exeを実行する だけです。インストールする先のディレクトリなどはここで変更できます。 デフォルトではc:\gnuwin32\b18\にインストールされます。 次にmingw32を展開します。ここではc:\mingw32というディレクトリに展開した ものとします。上記のアーカイブファイルを展開するとおそらくmingw32_014という 名前のディレクトリができると思います。この名前をそのまま使ってもmingw32という ディレクトリ名に変更しても構いません。次に展開したディレクトリに移動し、
move-win32 c:\gnuwin32\b18 c:\mingw32
を実行します。引数の二つのディレクトリはそれぞれcygwin32のインストール先と mingw32の展開先です。エラーメッセージが表示される場合はパスの指定が 間違っている場合があります。再度確認してください。

続いて環境変数などの設定をします。 command.comを使っている場合は次の内容をautoexec.batに加えます。

PATH=%PATH%;C:\gnuwin32\b18\H-i386-cygwin32\bin;C:\gnuwin32\b18\tcl\bin
SET TCL_LIBRARY=C:/gnuwin32/b18/tcl/lib/tcl7.6
SET GDBTK_LIBRARY=C:/gnuwin32/b18/share/gdbtcl
SET GCC_EXEC_PREFIX=C:\gnuwin32\b18\H-i386-cygwin32\lib\gcc-lib\
SET LIBRARY_PATH=C:\gnuwin32\b18\H-i386-cygwin32\lib;c:\mingw32\win32\lib;
SET C_INCLUDE_PATH=c:\mingw32\win32\include;
SET CPLUS_INCLUDE_PATH=c:\mingw32\win32\include;
tcshの場合は次の内容を.tcshrcに加えます。
path=(c:/gnuwin32/b18/H-i386-cygwin32/bin c:/gnuwin32/b18/tcl/bin $path);
setenv TCL_LIBRARY C:/gnuwin32/b18/tcl/lib/tcl7.6
setenv GDBTK_LIBRARY C:/gnuwin32/b18/share/gdbtcl
setenv GCC_EXEC_PREFIX C:\\gnuwin32\\b18\\H-i386-cygwin32\\lib\\gcc-lib\\
setenv LIBRARY_PATH C:\\gnuwin32\\b18\\H-i386-cygwin32\\lib;c:\\mingw32\\win32\\lib;
setenv C_INCLUDE_PATH c:\\mingw32\\win32\\include;
setenv CPLUS_INCLUDE_PATH c:\\mingw32\\win32\\include;
これらの環境変数の設定を反映させます(DOSプロンプトを再起動させるとか、 source .tcshrcするとか)。

以上でインストールは終了です。

c:\gnuwin32\b18\H-i386-cygwin32\bin にはUNIXコマンドが沢山ころがっています。


[4. プログラムを書いてみる]

まずmingw32のreadme.txtにあるテストプログラムを実行して、正しくインストール されているかどうかを確認します。 まずは定番のHelloWorldです。hello.cというファイル名で、次のプログラムを 入力します。
#include <stdio.h>

int
main ()
{
        printf ("Hello, world!\n");
        return 0;
}
できたらコンパイルです。
        gcc -o hello.exe hello.c
うまくgccがインストールされていればhello.exeが作成されるはずです。 cppが見付からないとかライブラリが見付からないとかincludeファイルが見付からない と言われたら環境変数の値を再度確認してください。またreadme.txtにも トラブル対処法の指針があります。 コンソールからhello.exeを実行すると、Hello, world!と表示されるはずです。

次はWin32のアプリケーションです。同じくreadme.txtにある次のプログラムを test.cというファイル名で作成します。

#include <windows.h>

int STDCALL
WinMain (HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmd, int nShow)
{
        MessageBox (NULL, "Test message", "Test", MB_OK);
        return 0;
}
コンパイルします
 gcc -o test.exe test.c -luser32
test.exeを実行すると、ダイアログが一つ表示されるはずです。これで Win32APIを用いたプログラミングはできる環境になりました。

[5. DirectXが使えなきゃ意味ないじゃん]

さて問題のDirectXですが、 gccを用いてDirectDraw対応のプログラムを書く方法が ここに あります。とりあえず展開して付属のスケルトンプログラムをコンパイルして みます。
gcc -o main.exe main.c -lddraw -luser32 -lgdi32
必要に応じて適当にインクルードファイルのpathを指定します。 でもできたmain.exeはなんにもしないプログラムなので面白くありません。 もうちょっと凝ったサンプルを作ってみましょう。

(現在実験中)


[6. 便利なライブラリ達は使えるのかな?]

世間は良くできているもので、ゲームを作るための便利なライブラリを 作っている人が沢山いらっしゃいますね。 ……。
こうして考えると、その昔のX68kやアーケードゲームでは盛んに行われた 割込みを駆使したスプライト枚数倍増やラスタースクロールの技術って どこに行ってしまったのでしょうね。

愚痴ばかりいっていても仕方がないの試しにWinGLを使ってみましょう。 とはいっても、簡単にはいきませんね。ライブラリを変換しなければならないし、 ヘッダファイルも適当に直さないといけない。でも、これらが使えるようになると かなり嬉しいので、ちょっと頑張ってみようかな。 (現在実験中)


[7. サンプルゲーム]


Masahiko Kimoto <kimoto@is.titech.ac.jp>
Last modified: Fri Jul 30 17:15:07 1999