|
|
|
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では、パラメータはありませんので、この変数は使用しません。
|