山内の授業補完のページ/Windowsアプリ

何はともあれ、実際にやってみましょう。

お決まりのサンプル "Hello World" をWindows上で!

プログラムの変更

手元にあるカーニハン&リッチーの古典的教科書「プログラミング言語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 入門 から借用して、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

ですね。これで何が起こりましたか?

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を実行しています。さて何が出てきたでしょうか? 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のメッセージボックスが表示されたことでしょう。

ここまでのレッスンは、

  1. Win32 APIを使ってプログラムする
  2. Cygwinでコンパイルするときに-mno-cygwinが要る ということでした。

添付ファイル: filehelloworldfailed.jpg 346件 [詳細] filehelloworld.jpg 352件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-07-22 (日) 11:52:19 (4439d)