[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
[[山内の授業補完のページ/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を使ってプログラムする
+Cygwinでコンパイルするときに-mno-cygwinが要る
ということでした。
終了行:
[[山内の授業補完のページ/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を使ってプログラムする
+Cygwinでコンパイルするときに-mno-cygwinが要る
ということでした。
ページ名: