アークピットのホームページに戻る

WinAPIトピックのトップページに戻る

APIトピックの各章に移動する

ダウンロードのページに移動する
ダウンロードができ
ない場合の対処法
 

ページ移動

1-3-4. WinMain関数

コメントの付け方

 コメントの入れ方は、千差万別だと思いますが、私の方法を少し説明します。まずソースコードの先頭でタイトルと著作権表示を行ないます。
/**********************************************************************
 *     ApHello for WIN32(The Sample of Windows API Topics)  v1.00     *
 *                       メインプログラムの処理                       *
 *                                                                    *
 *         (C) Copyright 1999 Arcpit Inc.  ALL RIGHT RESERVED.        *
 **********************************************************************/
 そして大分類を行なう場合は、タイトルと同じ様にアスタリスクで囲みを付け、3行でコメントを付けます。ソースコードは、1つのファイルが1,000行程度を目安にします。もちろん2,000行以上になることも、300行以下で終わることもあります。大分類は100行〜300行ぐらいに、1つ来ることを目安にしています。
/**********************************************************************
 *                     アプリケーションの初期処理                     *
 **********************************************************************/
 中分類から下は囲みを使いません。行数も最低で3行ですが、関数のパラメータ仕様や特徴が続くことが良くあります。小分類も同じ書式ですが、行数が最低で1行です。
//
// 指定したアイテムのウィンドウをアクティブにする。
//

// ダイアログボックスを使って、システムのエラーを表示する。
 分類用のコメントは、ソースコードを見やすくしたり、関数の仕様を記載しますが、これ以外に、コード中に挿入して処理内容を説明するためにもコメントを使います。

ヘッダファイルのインクルード

 インクルード文は次の2行だけです。Windowsのプログラムの場合は、最初の windows.h は必ずインクルードします。このファイルは、APIの関数プロトタイプやWindowsのもろもろの定義を行ないます。このファイルがさらにいくつものヘッダファイウをインクルードしますので、非常に大きなファイルになります。Windowsのコンパイルスピードが掛るのは、大部分はこのせいです。
#include <windows.h>
#include "ApHello.h"
 標準的なAPIしかコールしない場合は、windows.h のインクルードだけで良いのですが、通常はもっと色々なファイルをインクルードしなければいけません。
#include <richedit.h>
#include <commctrl.h>
 またWindowsのWIN32では、C言語の標準ライブラリを使用できますので、以下のインクルードを行なうことも良くあります。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mbstring.h>
 システムのインクルードは、<と>で囲みますが、ローカルのヘッダは、”(ダブルクォート)で囲みます。これはC言語の仕様で、ヘッダファイルを検索するディレクトリが区別されます。
 ローカルのインクルードは、今回は小さいので1つにしましたが、通常は次の2つに分離します。
#include "ApHello.h"
#include "Resource.h"
 ApHello.h は、このソフトの定義や構造体の宣言、グローバル関数のプロトタイプ宣言などを行ないます。Resource.h は、IDM_XXX,IDC_XXX などのRCファイルで使用する定数を主に宣言します。少し大きなソフトでは、多数のダイアログボックスを使用しますので、多くの定数が必要になります。よってこの様にしました。

WinMain関数

 Windowsのプログラムは、WinMain関数で始まります。C言語のmain関数と同じと考えても結構です。DLLファイルなどの例外はありますが、通常のソフトウェアは、必ずこの関数が含まれます。
INT  APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                      LPTSTR lpCmdLine, INT nCmdShow)
{
        :
        :
}
 初めての人は、この文だけ見ても、なじみない型や宣言の羅列で戸惑うかも知れません。しかしWindowsのプログラミングの文化は、慣れるよりしかたありません。1つづつ説明しますので、あきらめないでください。

 INTはintです。WIN32では32ビットの整数を返すのが決まりです。C言語の自然な型は使いません。windows.h で宣言され直した、型を通常使用します。これらは、すべて大文字で表現します。APIENTRYは、__stdcall ですので、「通常のAPI仕様だよ」と言う意味しかありません。システムがコールする関数は、勝手に関数のタイプを決める訳にはいきません。ちゃんと決められた仕様で宣言する必要があります。この他には、CALLBACK,DLGPROC などの宣言もあります。

 WinMain関数は、HINSTANCE が2つと、lpCmdLine,nCmdShow の4つのパラメータがあります。まず、HINSTANCE の H はハンドルを示します。このハンドルを理解するのが、Windowsプログラミングの第1歩です。HWND,HPEN,HGLOBAL などハンドルは多数あります。HINSTANCE,HWND,HPEN,HGLOBAL などは、すべて HANDLE と宣言されます。要するにこれらの実体は、まったく同一です。ハンドルとは、何らかの「要素」を識別するための手段です。単なる一意な番号と思っても、そう間違っていません。C言語のファイルを識別する FILE の考え方と同じです。HINSTANCE,HWND,HPEN,HGLOBAL は、それぞれ、プログラム・ウィンドウ・ペン・メモリブロックを指します。ハンドルはシステムが管理します。ユーザは、それの作成・使用・破棄をシステムに要求します。作成でハンドルを得て、使用する場合に、ハンドルでそれを識別します。そして破棄でハンドルが解除されます。例えば、HWNDの場合は、CreateWindow 関数で作成されます。そして、MoveWindow,CloseWindow などの数々の操作関数で使用し、DestroyWindow で破棄されます。つまりハンドルは、作成されてから、破棄されるまで有効です。なお、HANDLE の実体は、void * なので、作成に失敗してエラーが起こった場合の返り値などの様に、エラーや不定の場合は、NULL で示します。

 それでは、HINSTANCE です。最初の hInstance は、このプログラム(インスタンス)を識別する番号です。これはシステムがプログラムを実行した時点で作成します。そして、hPrevInstance は、アプリケーションの以前のインスタンスを識別しますが、WIN32アプリケーションの場合、 このパラメータは常にNULLです。Windows v3.1 との互換のためのいパラメータでWIN32では意味がありません。

 lpCmdLine は、文字列のポインタで、このアプリケーションを起動するときのパラメータの文字列です。しかしC言語の argv,argc の様に区切りごとに書式化されている訳ではありません。単なる文字列ですので注意してください。ApHelloでは、パラメータはありませんので、この変数は使用しません。
 nCmdShow は、起動時のウィンドウの状態を指示します。ウィンドウの状態とは、通常・最大化・最小化を示します。Windowsでは、ショートカットでアプリケーションを起動する場合は、上記の3つのどの状態にするか指定できます。デスクトップ上のショートカットを右クリックして、「プロパティ」を実行すれば、[ショートカット]タブの、「実行時の大きさ」でウィンドウの起動時の状態を設定します。これに対応して nCmdShow が与えられます。これは、WinMainの内部処理でもう一度触れます。

ページ移動