第4章 Windowsの入り口
2006年8月9日
さて、いよいよWindowsプログラミングに挑戦してみよう。
マルチタスクでグラフィカルなOSってとこが売りのWindowsであるが、ソースは当然テキストで書くことになる。
これまで色々試してみて感じたことは、主導権が完全にOSにあること、グラフィカルな部分はOSが提供する機能の範囲で実現可能なので、基本的にシンプルであること、そして、あらゆる機能が関数で提供される為、膨大な資料の中から必要な機能を探す必要があること、などである。
特に、やりたいことを決めてから機能を探すか、あらかじめ知っている機能の中から何が出来るのか考えて取り掛かるか、の判断が難しいと思った。
ともかく、何にもしないことをプログラムしてみる。
事実上最小のWindowsプログラムだと云えるだろう。
/*
Title :List.001-001
Filename:"main.cpp"
*/
//インクルードファイル---------------------------------------
#include <windows.h>
//エントリーポイント-----------------------------------------
int WINAPI WinMain( HINSTANCE main_instance,
HINSTANCE
pre_instance,
LPSTR
argment_characters,
int window_mode)
{
return 0;
} |
| ソースのダウンロード |
いきなり関数main()が無いので少し戸惑ってしまうが、なにもC言語の仕様が曲げられてしまっているわけではない。
あくまで、マイクロソフトが用意した偽りのエントリーポイント関数WinMain()を使用しなさいよ、と云うだけのことのようだ。
試しに、次のようなNGソースを用意してコンパイルしてみる。
/*
Title :List.001-002
Filename:"main.cpp"
*/
//#include <windows.h>
コメントアウトしてみる
int WINAPI WinMain( HINSTANCE main_instance,
HINSTANCE
pre_instance,
LPSTR argment_characters,
int window_mode)
{
return 0;
} |
| ソースのダウンロード |
以上のソースがビルドできないことから、関数WinMain()は"windows.h"のどこかで宣言されたものだと推測される。
もう少し理解を深める為に(邪推する為に?)次のようなコードを書いてみた。
/*
Title :List.001-003
Filename:"header.h"
*/
//関数プロトタイプ宣言---------------------------------------
int AmaMain( int); |
/*
Title :List.001-003
Filename:"main.cpp"
*/
//インクルードファイル---------------------------------------
#include "header.h"
//偽りのエントリーポイント------------------------------------
int AmaMain( int number)
{
return 0;
} |
/*
Title :List.001-003
Filename:"amagraming.cpp"
*/
//インクルードファイル---------------------------------------
#include "header.h"
//本当のエントリーポイント------------------------------------
int main( void)
{
int answer= 0;
answer= AmaMain( 1);
return 1;
} |
| ソースのダウンロード |
ちなみに、これはコンソールのプロジェクトでないとビルドできない。
このようなコードを書いて"header.h"をライブラリと称し、関数AmaMain()の中にメインとなるソースを書けば、あたかも関数AmaMain()がエントリーポイントのように振舞ってくれるだろう。
もっとも、こんな陳腐な方法で関数WinMain()が実装されているはずは無いが。
コールバックプロシージャとかメッセージプロシージャなんて言葉に聞き覚えのある人は、なぜマイクロソフトがこんな面倒なことをしているのか想像がつくのかもしれない。
|