Windows Programming
CODE ゼロ

 

※ フォントを変えるのがせいぜいの楽しみなので、フォントをいろいろ変えてみます。しばらくフォントが統一されないかもしれません。

 



//
//  program "challange1.cpp"
//

#include <windows.h>

int WINAPI WinMain( HINSTANCE hCurInst, HINSTANCE hPreInst,
                    LPSTR lpszCmdLine, int nCmdShow )
{
      MessageBox( NULL , "かーめーはーめーはぁっ" , "Hello World !" , MB_OK | MB_APPLMODAL ) ;

      return 0 ;
}


ちょうど C 言語の void main() { printf( "Hello World !") ; return;} に相当します。C 言語の基礎に関しては、いずこなりで、目を通すくらいはしておいてください。


記述して保存したら、コンパイルは、

bcc32 -tW challange1.cpp

です。

 

challange1 [リターン] として実行してみましょう。




 なんだ、void main... に相当するものって、ちゃんとあるんじゃん、という新発見がありましたか?
 あるいは、#include ? MessageBox ってなんなんだ?



 MessageBox こそ、これから使う "Windows API 関数" の一つです。NULL は 0 と同じ。
 WinMain も、Windows API 関数です。WinMain はいつもあって、名前の決まっている関数です。この関数が特別なのは、自分で(あなたが)関数の中身を書かなくてはいけないということです。そういう API 関数は、Place-Holder といって他にもいくつかありますが、普通は API 関数は使うだけで、内容を書く必要のないものばかりです。


 上のプログラムで、もし WinMain関数 をとり去ってしまったら、プログラムは空になってしまうから、 "何も意味がない" ことはわかると思います(意味がありません)。そして、コンパイルすら通りません。この、"WinMain" 関数は、.exe 実行形式のファイルを作成する場合には、常に記述しておかなければならない関数です。注1

 WinMain の役割をする関数は、他にはなく、"この名前でこれ一つ" だと思っておいてください。そして、その引数(パラメータ)のかたち(並び、と型)と、戻り値、== プロトタイプ も決められていて、その決まった形にあわせて常に同じでなければなりません。(いくつか例に触れていくうちにわかります。)※ (DLL の場合は DllMain とかになりますが、それはとくに DLL を作る場合の話。今は、そして普通は EXE です。いづれにしろ、このような「エントリーポイントのための関数」 のバラエティーは、void main() も含めても、きわめて限定的です。)




注1 WinMain は、Win32 : 32 ビットの Win32 アプリケーションの場合です。16 ビット、コンソールアプリケーションの場合は、void main() や、int main()、int main(int argc, char *argv[]) で、この3つあたりが、"C 言語" の知識としては常識的な線です。はじめに 「int」 のついてるものは、これを省略することができます。(戻り値の)型が省略されている場合、C 言語では自動的に int 型、とみなされるからです。残念ながら、この3つで全て、と断言できないのが残念です。コンパイラの製作側(各会社の仕様)次第で、いくらでも拡張できるからです。こだわる場合は、どこかに、「C 言語の規格(ANSI-C)」に関する正式な文書があれば、それを見るのが一番安心です。これらでは、main が固有です。しばしば、"main 関数" と呼ばれます。main という単語が非常に一般的な英語ですので説明する側にとっては少々ややこしいです。WinMain 関数の場合は、"main 関数" の場合のように、「異なる型」をとりません。上の例の、「WINAPI WinMain( ..... 」 の、WINAPI の部分が、APIENTRY、__stdcall、 PASCAL の場合がありますが、"main 関数" の場合とは対照的に、これらの違いのほうは、すべて同じことを意味しています。 _tmain なんていうのもありますが、vc++ 専用で、C 言語や Windows API の標準的な知識とは異なります。繰り返し、これらは、「エントリーポイントのための関数」で、限定的なものです。そしてそれらのうちで選択したものに対応する、「コンパイラオプション」があるはずなので、コンパイル時に指定することになります (例えば "main 関数" の場合は、通常どのコンパイラでもオプションは不要)。ビット数に関しては 64 ビットくらいまでが常識的な線ですが、主要な家庭用パソコンでは大半が 32 ビットまでとなっています。5行くらいで収めたかったのですが・・・


※ コンパイル時の警告について。
( HINSTANCE hCurInst, HINSTANCE hPreInst, LPSTR lpszCmdLine, int nCmdShow ) のところで、 太字の部分は、変数(名) というものです。今回のプログラム内ではこれら変数を使っていないから、コンパイラが "警告" を出しますが、"エラー" ではないので問題はありません。 変数名を消して、( HINSTANCE, HINSTANCE, LPSTR, int ) のようにしてしまえば警告はでません。残った HINSTANCE などは、変数の "" といいます。

 

さて、MessageBox 関数には、Return Value : 返り値 というものがあるのですが・・・

 

 

トップ インデックス [次へ]