そもそも、Windowsって何?

Windows、それは…

Windows APIを使いこなせるようになるためには、まずWindowsの仕組みを理解してしまうのが最も近道です。むしろ、Windowsの理解なくしてWindows APIを使いこなすことはできないといっても過言ではありません。

しかし、Windowsは非常に複雑なシステムであり、それ全体を完全に網羅するなんてことは到底不可能なことです。ですから、システムすべてを知ろうとするのではなく、システムを構成する基本的な要素を1つ1つ理解していくのがいいでしょう。基礎をしっかりと理解していくことにで、より高レベルな部分を少しずつ理解していくことができますから。

そういうわけで、まず最も基本となるWindowsそのものについて説明していきましょう。

オペレーティングシステムとしてのWindows

すでにご存知のこととは思いますが、WindowsはOS (オー・エス)(Operating System:オペレーティングシステム)と呼ばれるものの1つです。

OSとは、コンピュータにおけるファイルシステムの管理やファイルへのアクセス、およびアプリケーションプログラムの起動と実行管理などといった最も基本的な操作を行う基本ソフトウェアのことを言います。OSは、ユーザー(あるいはアプリケーションプログラム)とハードウェアとの間に存在し、ユーザやアプリケーションプログラムがコンピュータのシステムをできるだけ簡単に使うことができるように、仲介役を果たしています。Windowsの大きな特徴であるグラフィカル(視覚的)なインターフェースというものもOSの機能として提供されています。

WindowsはOSとしてさまざまな機能を提供していますが、それらについては後で述べていくことにしましょう。

プラットフォームとしてのWindows

今言ったように、WindowsはOSなのですが、見方を変えて、プラットフォームとしての側面を持つソフトウェアであると言うこともできます。

プラットフォームというのは、ハードウェアおよびOSによって構成されている、プログラムの実行環境のことを言います。場合によっては、ハードウェアだけの環境(CPU、メモリサイズ、ハードディスク容量など)とか、OSだけの環境(使っているOSは何か)とか、あるいはアプリケーション開発(プログラミング)のための環境などを指すこともありますが、普通は、プログラムを実行させる「環境」のことをプラットフォームと呼びます。Windowsアプリケーションプログラムは、プラットフォームであるWindowsの上で実行されているとみなすことができます。つまり、Windowsが提供してくれるいろいろな機能に囲まれた環境のもとで、アプリケーションが実行されているのだと考えるのです。

ここでは、「OS」と「プラットフォーム」がまったく別のものであると言っているわけではありません。あくまで、OSであるという見方もできるし、プラットフォームであるという見方もできる、ということです。

「OSとして」というのは、マシンのシステム全体を絶対的な視点で見たときに、Windowsがユーザー(あるいはアプリケーション)とハードウェアの間にあって、その2つをつなぐインターフェース(仲介役、というか、窓口みたいなもの)の役割を果たしている1つのシステムとみなせる、ということです。

一方、「プラットフォームとして」というのは、ユーザー(あるいはアプリケーション)に視点を置いて見たときに、Windowsという環境の中で、ユーザーが操作したり、アプリケーションプログラムが実行されたりするということを表しているのです。

全体的に見れば、OSというのは実行環境であるプラットフォームを決定する要素の1つであるに過ぎないのです。OSが変われば当然プラットフォームとしては別のものになりますが、OSの種類やバージョンが同じでも、例えばどの種類のCPUを使っているかとか、Internet Explorerをインストールしているかどうか、さらには、ハードディスクの容量はどのくらいか、ディスプレイのサイズや表示可能色はいくつか、MIDI音源を持っているか、などといったことによってもプラットフォームは変わることになります。

Windowsの特徴と機能

Windowsは、ユーザーが簡単にコンピュータを使えるように、そしてプログラマが簡単にWindowsアプリケーションを作成できるように、さまざまな特徴を持っていて、数多くの機能を提供しています。

GUI

Windowsの持つ特徴の1つは、何といってもGUIにあります。GUIとは、Graphical User Interface(グラフィカル・ユーザー・インターフェース)のことで、操作を視覚的に行えるようにして、誰にでも容易にコンピュータを操作できるようにしたものです。

このようなGUIが導入される以前、すなわちMS-DOSの時代には、すべての操作は文字入力、つまりコマンドなどをキーボードで打ち込んで……という面倒なことによって行われていたのです。また、実行結果もすべて文字で出力されていました。具体的にどういうものかというと、スタートメニューの「アクセサリ」から「コマンド プロンプト」(Windows 95/98/Meでは「MS-DOS プロンプト」)を実行させたときに表示される画面のことです。現在のようにウィンドウの中に表示されていたのではなく、画面全体がそれを覆っていました。体験してみたければ、「コマンド プロンプト」を実行させて [Alt] + [Enter] を押してみてください。このMS-DOS時代のインターフェースをCUI (Character-based User Interface;キャラクタベース・ユーザー・インターフェース)と呼びます。そのようなCUIによる操作は大変で不便でしたので、より便利なGUIへと移行したというわけです。

アプリケーションごとにウィンドウがあって、アイコンやボタンやメニューが表示されていて、マウスクリックで簡単に操作、タスクバーの「スタート」メニューからアプリケーションを簡単に起動、といったように、例を挙げればきりがありませんが、そのようなさまざまなGUIの機能がWindowsから提供されているのです。

プラットフォームの統一

Windowsの持つもう1つの特徴として、どのコンピュータにおいても、できるだけ統一されたプラットフォームを提供するということが挙げられます。すなわち、Windowsアプリケーションとして作成されたプログラムならば、Windowsがインストールされているどのコンピュータでも動作し、同じ結果をもたらすようにすることです。基本的には、Windows用に作成された実行ファイルなら、Windowsがインストールされているどのコンピュータでも実行させることができるようになっているのです。

実際にはWindowsのバージョンアップに伴って追加されたり廃止されたりしている機能もあるため、必ずしも全Windowsプラットフォームで互換性があるとは限りませんが。それでも、多くの場合は問題なく実行させることができます。

マルチタスク

Windowsには、複数のプログラムを同時に実行できる機能があり、マルチタスクと呼ばれています。これによって、複雑なタスク(作業)をそれぞれ別のプロセスに分けたり、同じプログラムを複数起動したりすることもできるようになります。

以前のMS-DOSの時代には、ある1つのプログラムが実行されていると、その間は他のプログラムを実行させることができませんでした。また、16ビットWindowsでは、現在の32ビットWindowsとは違った方法でマルチタスクを実現していたのですが、どれか1つのプログラムが(バグなどで)フリーズした場合はマシン全体がフリーズする、という非常に不安定なものだったのです。

32ビットWindowsでは、OSであるWindowsが中心となって、それぞれのプログラムを順番に実行していくような仕組みになっていて、16ビットWindowsのときのような不安定さがなくなっています。(それでも 9x 系はやや不安定さがありますが……。)

マルチタスクを実現させるための仕組みとして、「プロセス」や「スレッド」などの用語が出てくることになりますが、それはまたの機会ということで。

ウィンドウ

上で述べたGUIを実現するためのWindowsの構成要素の一つがウィンドウです。直訳すれば『窓』ということになりますが、Windows上でのウィンドウというのは、ご存知のように、アプリケーションによってディスプレイ上に表示されている長方形の領域のことです。まさにアプリケーションの『窓』というわけです。

しかし実際には、それだけをウィンドウと呼ぶわけではありません。Windowsにおいては、ツールバーやステータスバー、押しボタン、ラジオボタン、チェックボックス、テキスト入力ボックス、リストボックス、ツールチップまでもが、実は1つのウィンドウということになっているのです。最初はとっつきにくいかもしれませんが、そういうものなんだと割り切ってみてください。

Windowsは、システム上に存在するすべてのウィンドウをウィンドウハンドルと呼ばれるものによって識別し、管理しています。ウィンドウハンドルとは、ウィンドウを識別するためにそれぞれのウィンドウに割り当てられている数値のことです。Windowsは、すべてのウィンドウを管理するためのテーブル(表)を作成していて、ウィンドウに関する情報が必要になったときは、ハンドルを元にそのテーブルを参照することで目的となるウィンドウに関する情報を引き出します。そのため、アプリケーションがウィンドウに何らかの処理をしたい場合、API関数を呼び出すときに対象となるウィンドウのハンドルを指定しなければなりません。

もちろん、HSPで作成されるウィンドウもそれぞれ異なるウィンドウハンドルを持っています。また、HSPのオブジェクト作成命令で作られたテキスト入力ボックスやコンボボックスなどもそれぞれのウィンドウハンドルを持ちます。HSPではシステム変数やHSP標準関数を使用して、これらのハンドルを取得することができるようになっています。それについては、必要となった時点で説明することにします。

ウィンドウメッセージ

ウィンドウメッセージ(単にメッセージとも呼ばれる)とは、Windowsシステム、もしくはユーザーが発生させたイベントをアプリケーションに伝えるためのものです。すなわち、アプリケーションに送る、いわば「お知らせ」のようなものです。実際にはアプリケーションが持っているウィンドウに送られるので、このような名前がついています。

具体的には、ユーザーがキーボードのキーを押したとか、マウスを動かしたとか、クリックしたとか、ウィンドウサイズを変更したとか、ウィンドウ上のボタンを押したとか、メニュー項目を選択したとか、……、……、とにかく、いろいろなことをイベントとしてウィンドウに伝えてくるのです。

アプリケーションは、ウィンドウに送られてきたメッセージに対して、さまざまな処理を行います。右クリックされたらどうするとか、ボタンが押されたらどうするとか、イベントに対してどんな処理をするのかは、アプリケーションが決めなくてはなりません。このような処理をメッセージ処理などと呼ぶことがあります。メッセージ処理は、GUIを実現するために必要となる重要なものです。

また、このように、イベントが送られてくるまではプログラムが停止していて、メッセージが送られてきたらそれに対して処理を開始するという、Windowsでは一般的に行われている処理の形式のことを「メッセージ駆動方式」(あるいは「イベント駆動方式」、「イベントドリブン」など)と呼んだりもします。

HSP3では、任意のメッセージが送られたときの割り込み実行機能がサポートされています。この機能により、あらかじめ設定しておいたウィンドウメッセージを受け取ったときに、任意のラベルにジャンプしてそのスクリプトを実行することができます。ここ『Advanced HSP』でも、その機能を利用したメッセージ処理を説明していきます。

Windows API

API (エー・ピー・アイ)とはApplication Programming Interface (アプリケーション・プログラミング・インターフェース)の略で、アプリケーションプログラムがOSやデバイスから提供されている機能にアクセスするためのインターフェースのことです。一般に、APIはアプリケーションから呼び出すことのできる関数のセットという形でOSから提供されています。

Windowsが提供するAPIを特にWindows APIと呼びます。これは、プログラマが画面出力やユーザー入力などの処理を簡単に行うために、Windowsが基本的な機能をはじめから用意しておいて、プログラマがその機能を自由に使うことができるようにしたものです。Windows APIは、Windowsが進化(バージョンアップ)するとともに、どんどんと変更・拡張が続けられてきています。

さらに、Windows APIのなかで、32ビットWindowsが提供しているものを特にWin32 APIと呼んでいます。また、Win32 APIをサポートするプラットフォーム(つまり、32ビットWindowsがインストールされた環境)をWin32プラットフォームと呼んだりもします。以降では、単に「API」と書くことがたびたびありますが、それは「Windows API」、特に32ビット環境の「Win32 API」のことだと思ってください。Windows APIについてのより詳細な説明も、また後の機会に行うことにします。

Windows APIは、先ほど述べたプラットフォームの統一を目的として提供されている重要な機能です。原則として、異なるWindowsプラットフォームの間(例えば、Windows 95とWindows NTの間)でも互換性が保たれるように、それぞれのWindowsで同じAPIを提供しています。アプリケーションは、APIを使用することで、どのWindowsでも動作することができるようになるのです。

Windowsの種類

現在、WindowsにはWindows 95、98、2000、XPなど、いくつもの種類があることはご存知でしょう。ソフトウェアであるWindowsが年月を経るごとに次々とバージョンアップされてきているために多くの種類があるのですが、現在の32ビットマシン環境で使用されるWindowsは、大きく次の2つに分けられます。

一般に、前者は総称してWindows 9x系あるいは9xカーネルなどと呼ばれ、後者はWindows NT系あるいはNTカーネルなどと呼ばれます。これらはどちらも32ビットWindowsということになっていますが、この2つには実は大きな違いがあるのです。

Windows 95 / 98 / 98 SE / Me

Windows 95は、もともとコンシューマ向け、つまり、家庭用のパソコンで使用されることを目的として作られたOSです。Windows 95より以前はMS-DOS、あるいは16ビットのWindows 3.1などが一般的なパソコン用OSとして使われてきたため、Windows 95ではそれらとの互換性が重視されています。

互換性を保つという要求を満たすために、Windows 95のシステムは、それまでの16ビットWindowsのプログラムコードがそのまま使用されている部分が多くあります。カーネル(OS の中核部分)も古い16ビットコードが使用されている部分が多く、そのために16ビットWindowsの欠点がいくつか引き継がれてしまったりもしています。また、それまでの16ビットアプリケーションの中には、ハードウェアに直接アクセスするものも多く、Windows 95もまたそれを許しているため、しばしばマシンをクラッシュさせてしまうこともあります。OSが持っているべきセキュリティなどの機能もありません。つまり、Windows 95は、16ビット時代との互換性を保つ代わりに、堅牢性や機密性などを犠牲にしたOSなのです。

以降のWindows 98やWindows Meも、細かい部分では改良がなされているものの、基本的にはWindows 95のカーネルが引き継がれているため、これらの欠点も引き継いでいるのです。Windows 9x系はWindows Meが最後で、これ以降はもう出てくることはありません。

Windows NT / 2000 / XP / Vista

これに対してWindows NTは、ワークステーションやサーバなどといったシステムのOSとして作られたもので、その目的ゆえに、頑丈で、機密性にも優れたものである必要がありました。そのため、それまでの貧弱な16ビットコードは一切使わず、すべて32ビットプログラムコードで一から作り直されたのです。

このため、Windows 9xと比べるととても安定していて、マシンがクラッシュすることも非常に少なくなっています。1つのアプリケーションのバグでマシンが止まることはほとんどありませんし、その他にも、ネイティブなUnicodeのサポートやマルチプロセッサ(複数のCPU)のサポートなど、9x系にはない機能が多く含まれます。

逆に、いくつかの面で互換性が失われてしまうということもあります。16ビット時代のアプリケーションを動作させるためのサブシステムが存在するとはいえ、デバイスを直接操作したりする多くのアプリケーションは動作させることができません。また、NT4.0以前では、比較的新しいバージョンのDirect Xを必要とするアプリケーションも実行できません(Windows 2000以降では可能になっていますが)。 Windows 9x用に作られているアプリケーションでも、NT系で動かすことができなかったりするものも多く存在します。(2000やXPになってだいぶ減ってきてはいますが、デバイスを直接操作するタイプのものなどは使用できない場合があるようです。) ただし、現在ではWindows 2000/XP/Vistaが一般家庭のパソコンに普及し、ほとんどのソフトウェアはそれに対応しているので、あまり問題にはなっていません。