[[山内の授業補完のページ/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が要る
ということでした。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS