[[山内の授業補完のページ/Windowsアプリ]] 何はともあれ、実際にやってみましょう。 お決まりのサンプル "Hello World" をWindows上で! ***プログラムの変更 [#m634b05d] 手元にあるカーニハン&リッチーの古典的教科書「プログラミング言語C(第2版)」 から、<純正>の"Hello World"プログラムを。 #include <stdio.h> main() { printf("hello, world\n"); } オリジナルは"¥"は「逆スラッシュ」ですが、日本語環境なので「円サイン」に なっても許してもらいましょう。 これをMS Windows環境下で動かすにはどうするか? Cygwin (つまりLinux/UNIX環境)では、コンソールの上に「hello, world」と 出力しますが、MS Windows環境下のアプリケーション(今後は(ネイティブ)Win32 アプリと呼ぶことにしますが)では、《どこにしゅつりょくしたらよいのでしょう》。 Win32アプリでは「メッセージボックス」と呼ばれる小さなウィンドウを開いて、 そこにメッセージを表示することができます。これを使うことにしましょう。 問題は、Linux/UNIXアプリでのprintf関数(=コンソールにメッセージを表示)が、 Win32アプリでは自動的にメッセージボックスでの表示に変換されるわけではない、 ということです。なぜか? 想像するに、コンソールにただ文字列を書き出すのと 違って、ウィンドウを開いて表示するとすると、どこまでを1つのウィンドウに するか(コンソールのときは文字列を複数回のprintfに分けて書いてもよかった)、 とか、ウィンドウの位置や色などの属性(プロパティ)を設定できる (ホントかな?)とか、違った制御が必要になるのでしょう。だから同じには 扱えないのだろうと思います。 とにかく、自動的に変換してくれません。プログラマは自分で書くことになります。 でも、Win32 APIではかなり簡単に書けるように準備してくれてあります。以下の サンプルはこちらの[[Win32 API 入門:http://www.wisdomsoft.jp/dev/api/windows]] から借用して、hello worldに変更したものです。 #include <windows.h> int WINAPI WinMain( HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow ) { MessageBox(NULL , TEXT("Hello World") , TEXT("My Message Box") , MB_OK); return 0; } C言語のプログラムの構造が、普通と違うな、と思われるでしょう(mainではなくて int WINAPI WinMainで始まっている)が、その辺はあとでゆっくりと見ます。 さしあたって、このプログラムをこの通り、ファイルhello.cに準備しておいて、 早速コンパイルしてみましょう。 まずは今までどおりのCygwin環境でやってみます。 gcc -o hello.exe hello.c 実行するには ./hello.exe ですね。これで何が起こりましたか? #ref(helloworld.jpg,,center,around); 小さなウィンドウ(メッセージボックス ウィンドウ)が開いて、タイトルに「My Message Box」、内容に「Hello World」 と書かれていましたか? では、「OK」ボタンを押して終了しましょう。 これで一件落着。でも待ってください。これはhello.exeプログラムをCygwinの コンソールから起動したのですが、MS Windowsの中で起動したらどうなるでしょうか? これを試すために、hello.exeをMS Windowsの「コマンドプロンプト」の中で 起動してみることにしましょう。コマンドプロンプトは、「スタート」ボタンから 「すべてのプログラム」を選んで、「アクセサリ」を選ぶと出てきます。 「コマンドプロンプト」を起動してください。 hello.exeプログラムはCygwinの中で作られたので、普通の環境ではC:\cygwin\home ディレクトリの下の、あなたのユーザホームディレクトリ下に置かれているはずです。 今お見せする例では、C:\cygwin\home\yamanouc\testwin32api に置いているので、 cdコマンド(MS DOSでもcdコマンドです)でディレクトリを移動します。 C:\> C:\>cd cygwin\home\yamanouc\testwin32api C:\cygwin\home\yamanouc\testwin32api>hello.exe 最後の行で、hello.exeを実行しています。さて何が出てきたでしょうか? &ref(helloworldfailed.jpg,,left,around); が出てきたと思います。 そう、Cygwinで(デフォルトの条件で)作った.exeプログラムが走るためには、 Cygwinの仕組が必要なのです。そのため、「cygwin1.dllが無いよ」というメッセージ がでてきたわけなのです。 でも、我々はCygwinの環境を必要としないプログラムを作ろうとして、わざわざ Win32 APIを使ってメッセージボックスを作ったのでした。だから、Cygwinの 利用をはずしてやることにします。 もう一度Cygwinのコンソールへ戻って、hello.cのコンパイルをしなおします。 今度は gcc -o hello.exe -mno-cygwin hello.c としてコンパイルしてみてください。この-mno-cygwinつまり-mフラッグで no-cygwinを指定したことが、前と異なる点です。ではできたhello.exeを まずはそのままCygwinのコンソールで起動してみましょう。一応前と同じように 起動されました。 では、MS Windowsの「コマンドプロンプト」画面の中で起動してみましょう。 今度は、Cygwinのコンソールから起動したのと同じように、 Hello Worldのメッセージボックスが表示されたことでしょう。 ここまでのレッスンは、 +Win32 APIを使ってメッセージ表示する +Win32 APIを使ってプログラムする +Cygwinでコンパイルするときに-mno-cygwinが要る ということでした。