「ソフトウェア工房」 スタート!
今日から記事のカテゴリに「ソフトウェア工房」を追加しました。プログラミングの話題を中心に興味ある話題を分かり易く解説できればと思います。
私が初めてパソコン上でソフトウェアを開発したのが、昭和60年(1985年)。当時は、汎用機やオフィスコンピュータ(略称はオフコン)が主流で、パソコン上でまともなソフトウェアができるのか・・!? と思われていた時代です。私も周囲から冷ややかな目で見られていました。
以来、公私ともにパソコンの魅力にとりつかれ、現在でもパソコンに向かってプログラムを作ることをしています。
個人で最初に購入したパソコンは、NECラップトップパソコン「PC-9801 LS5」です。本体の値段が 866,000円 と今のパソコンの約5倍です。今思えば良く買ったと思います。
さて、第1回目は、『ウインドウのバージョンを取得する』方法です。
マイクロソフトのウインドウ(Windows)は、「Windows95」から昨年発売された「Windows7」まで度々バージョンアップが繰り返されてきました。
その都度、いろいろな機能が付加されたり、機能がアップがされています。使用者にとっては魅力的なバージョンアップも、プログラムを作る側から見ると少々厄介なことがあります。それは、バージョンによって使える機能や機能の呼出方法が異なるためです。
事前にプログラムが稼働するウインドウのバージョンを取得し、プログラムの挙動を変えることができたら、同じプログラムでも異なる環境でプログラムを実行することができます。
ウインドウのバージョンは、次の手順で取得することができます。これらの技術情報は、マイクロソフトのMSDN(Microsoft Developer Network)に載っています。興味のある方は、「こちら」のサイトを参照してください。
?まずOSのバージョンを格納する構造体を用意します。構造は、次の通りです。
typedef struct _OSVERSIONINFO {
DWORD dwOSVersionInfoSize; // structure size
DWORD dwMajorVersion; // major version
DWORD dwMinorVersion; // minor version
DWORD dwBuildNumber; // build number
DWORD dwPlatformId; // platform ID
TCHAR szCSDVersion[128]; // additional string
WORD wServicePackMajor; // SP major version
WORD wServicePackMinor; // SP minor version
WORD wSuiteMask; // product suites
BYTE wProductType; // additional information
BYTE wReserved; // reserved
} OSVERSIONINFOEX, *POSVERSIONINFOEX, *LPOSVERSIONINFOEX;
?Windows APIの「GetVersionEx」を使って構造体に情報を読み込みます。
Windows APIとは、ウインドウの各機能にアクセスするためにあらかじめ用意された機能です。
?読み込まれた「dwMajorVersion」と「dwMinorVersion」がOSのバージョン番号になります。
取得した「dwMajorVersion」と「dwMinorVersion」の組合せでバージョンを表現します。
ウインドウズは、大きく9X系かNT系の2つのプラットホームに分かれます。
取得した「dwPlatformId」が "1" の場合は、9X系 (Windows95、Windows98、Windows98(SE)、WindowsMe)。"2" の場合は、NT系 (WindowsNT、Windows2000、WindowsXP、Windows2003、Windows2008、Windows7) と云うことになります。
ここで疑問が出てきます。表のバージョン番号(Version number)を見ると、異なるOSにもかかわらずバージョン番号が同じものがあります。
これは、OSの中核(カーネル)が同じことを意味します。例えば「Windows7」は「Windows2008 R2」をベースに作られていることが分かります。
また、バージョン番号が同じでもOSの作成されたタイミングが異なることもあります。これは構造体の「dwBuildNumber」で判断することができます。