このサイトでは、分析、カスタマイズされたコンテンツ、および広告に Cookie を使用します。このサイトを引き続き閲覧すると、Cookie の使用に同意するものと見なされます。
Hi, Developers,
straightapps.com ロゴ
作成 January 13, 2023、追記 July 12, 2023
トップページ > Windows トップ > Windows のバージョンを調べる
line
Windows 開発
line

ここでは、Windows のバージョンを調べる方法について、書いています。

プログラム起動時に、実行している Windows のバージョンを知り、 例えばすでにサポート終了となっている Windows 7 や Windows 8.1 より前のバージョンならメッセージを出す、 のような処理をしたいことがあります。 あるいは逆に、Windows 11 では検証不十分なのでその旨メッセージを出す、 といったことも考えられます。

かつては GetVersionEx 関数OSVERSIONINFO 構造体 を渡せば、 メジャーバージョン ( 5 なら Win2000 または WinXP、6 なら WinVista 〜 Win8.1、10 なら Win10 です。 ) マイナーバージョン ( メジャーバージョンだけでは特定できない区別ができます。 ) 、プラットフォーム ID などを得ることができ、 これらから Windows 7 なのか、Windows 8.1 なのか、あるいは Windows 10 なのか、知ることができました。

ところが先日気付いたことに、いつの間にか、この関数がビルドエラーを出すようになっていました。

error C4996: 'GetVersionExW': が古い形式として宣言されました。 note: 'GetVersionExW' の宣言を確認してください

まあ、それほど需要がある関数でもありませんので、昔のコードが動かなくなっていることには驚きませんが、 代替となる関数の使い勝手が非常に気に入らない感じでしたので、記録しておくことにしました。

すんなりいかない代替関数については、 「バージョン ヘルパー関数」 を参照してください。

以下のコードは、ほとんどが Windows 10、Visual Studio 2022 で作成、確認したものです。 一部、Visual Studio 2015 での実行結果も混ざっています。

追記した Windows 11 での検証については、Windows 11、Visual Studio 2022 で確認したものとなっています。

▼ 広告 ▼

▼ セクション一覧

どうしても時間がない場合は
用意したネームスペースにクラスを作成
判定関数の実装(Win8 以前)
判定関数の実装(Win8 以降) - January 16, 2023 追記
判定関数の実装(Win11) - January 28, 2023 追記
 現時点での Win11 判定方法
OS バージョンを文字列に変換する - July 12, 2023 追記
32 ビットか 64 ビットかの判断

なお、本サイトのご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。

どうしても時間がない場合は

投稿 January 13, 2023

まず最初に、今このページにたどり着いたものの、 新しいコードに置き換える時間もないぐらい慌てている場合は、どうやら奇策があるようですから、そこからメモしておきます。

従来の GetVersionEx 関数 を使用したコードはビルドエラーとなり通りませんが、 この関数自体はインテリセンスで表示されるように、実装は行われている模様です。

いつまで正常に動作するかはわからないまま、危険を承知で無理やりビルドを通すには、 関数呼び出しを行っているソースファイルに、次の 1 行を追加すればよいようです。

#pragma warning(disable: 4996)

warning pragma は、指定した警告を出力しないようにしたり、エラーにしたり、あるいはたくさん表示されるのを 1 回に制限したりできるようです。

上記の場合は、警告 4996 を出力しない、ということになります。

これでビルドを行うと、4996 の警告が表示されることなく、ビルドが正常終了します。

Windows 10 だけで試す限り(仕様通りに)正常に動作しているように思えますが、 「マニフェスト」を適切に設定していない場合は(デフォルトのままの場合は)、 Windows 8 と判断される仕様になっているようですから、その部分も面白くありません。 詳細は 「IsWindows10OrGreater 関数」 の注釈の欄に書かれていますが、これを回避するためのコード例はこのあとの実装部分に書いています。

なお、この #pragma 文を書き込むと、他の原因の警告 4996 もでなくなってしまいますので、 次のように必要な部分のみ適用するほうがいいようです。

#pragma warning(push)
#pragma warning(disable: 4996)
	GetVersionEx(&m_ovi);
#pragma warning(pop)

あるいは、SDL チェックがあるため、警告なのにビルドエラーになっているようですので、 SDL チェックを行わないようにすれば回避できます。

プロジェクトのプロパティ

上の画面は、Visual Studio 2015 でのキャプチャです。 並び順などはバージョンにより異なるかもしれませんが、SDL チェックを「いいえ」に変更します。

これで警告のままエラー扱いされずにビルドは正常終了となります。

#pragma と基本的に同じで Windows 10 だけで試す限り正常に動作しているように思えますが、 「マニフェスト」を適切に設定していない場合は(デフォルトのままの場合は)、 Windows 8 と判断される仕様になっているようですから、面白くありません。 回避するためのコード例はこのあとの実装部分に書いています。

▲ページ先頭へ

アイコン _sprintf でリンクエラーを回避する
Visual C++ の古いプロジェクト、具体的には Visual C++ 2013 より前のプロジェクトで、 キャラクタバッファにフォーマット文字列を設定する sprintf 関数 を利用していると、 Visual C++ 2015 以降 ではリンクエラーになってしまいます。 回避する方法を検討しています。



用意したネームスペースにクラスを作成

投稿 January 13, 2023

代替となる関数は、VersionHelpers.h で定義されている、 IsWindows7OrGreater 関数や、 IsWindows8OrGreater 関数とされています。 1 バージョンずつ、それ以降かどうかを判断することになったようです。

特定のバージョンを探すにはこのほうが簡単ですが、 ここでは特定のバージョンのチェックではなく、一体どれなのか、調べることにします。

このあと OS 判定用の専用クラスを作成しますが、安全のため、独自のネームスペース内に定義することにします。 小規模のプログラムの場合は、特にネームスペース内で定義する必要はありません。

nsCheckOSVer.h のようなファイル名で、以下の定義を行いました。

以降のクラス定義は、このネームスペース内に置いています。

namespace nsSA
{
	// ここに COSVer クラス等を定義
}

以降、OS のバージョン判定クラスです。 クラス名は COSVer としていますが、もちろん何でも構いません。

まずは COSVer クラスのコンストラクタデストラクタです。

class COSVer
{
	public:
		/**
		*  コンストラクタ
		*/
		COSVer();

		/**
		*  デストラクタ
		*/
		~COSVer();

OS のバージョンを判定する GetVer 関数と、 GetVer 関数が返した値を文字列に変換する GetVerString 関数を定義します。

		/**
		*  OS バージョン判定
		*    enum nsSA::OSVer にある値を返します。
		*/
		int GetVer(void);

		/**
		*  OS バージョン文字列を返します。
		*/
		LPCTSTR GetVerString(int nVer);

せっかくですので、実行している OS が 32 ビットか、64 ビットかを判断する IsOSx64 関数も入れています。

		/**
		*  OS が 64 ビットかどうかを調べます。
		*    この実行ファイルが 32 ビット(x86 ビルド)でも 64 ビット(x64 ビルド)でも判断できます。
		*    ただし、AMD/Intel 以外のプロセッサでは正しく判定できないかもしれません。
		*/
		bool IsOSx64(void);
	};

内部関数として、Win10 でも Win8 と判定される問題を解決するためのレジストリ読み取り関数 GetVerFromRegistry も定義しておきます。

	private:
		/**
		*  レジストリからバージョン番号を取得します。
		*/
		
		bool GetVerFromRegistry(int& nMajorVer, int& nMinorVer);

最後に、GetVer 関数が返す値を enum で定義しておきます。

	/**
	*  GetVer 関数が返す OS 種別
	*/
	enum OSVer
	{
		OS_Unknown = 0,		// Unknown
		OS_Win2000,		// Windows 2000
		OS_WinXP,		// Windows XP
		OS_WinVista,		// Windows Vista
		OS_Win7,		// Windows 7
		OS_Win8orLater,		// Windows 8 以降(特定できず)
		OS_Win8,		// Windows 8
		OS_Win81,		// Windows 8.1
		OS_Win10,		// Windows 10
		OS_Win11		// Windows 11
	};
}

これで実装準備は完了です。

▲ページ先頭へ

判定関数の実装(Win8 以前)

投稿 January 13, 2023

nsCheckOSVer.cpp のようなファイル名で、以下の実装を行いました。

コンストラクタ、デストラクタは特に何も行いません。 ネームスペース内に配置しない場合は、namespace で囲む必要はありません。

#include "stdafx.h"
#include "nsCheckOSVer.h"

#include "VersionHelpers.h"

namespace nsSA
{
	/**
	*  コンストラクタ
	*/
	COSVer::COSVer()
	{
	}

	/**
	*  デストラクタ
	*/
	COSVer::~COSVer()
	{
	}

	// 以降、下記のクラスの実装を記述
}

OS のバージョンを判定する、GetVer 関数の実装です。 基本的には 「バージョン ヘルパー関数」 にある代替関数の連続呼び出しです。

	/**
	*  OS バージョン判定
	*    enum OSVer にある値を返します。
	*/
	int COSVer::GetVer()
	{
		//  Windows XP より以前の場合は Windows 2000 と判定して返します。
		if (!IsWindowsXPOrGreater()) {
			return OSVer::OS_Win2000;
		}

まずは古いほうから 1 つ判断している部分です。

IsWindowsXPOrGreater 関数 は、サービスパック適用なしの Windows XP か、それより新しいかを判断してくれる関数です。 WinXP でもすでにほぼ稼働していることはないでしょうが、判定関数としては用意されています。 WinXP 以前と言っても Win2000、WinME、Win98、Win95 や Win3.1 などありますが、まず必要ないでしょうから Win2000 として返しています。 表示としては、GetVerString 関数の実装で工夫できます。

		//  Windows Vista より前なら Windows XP です。
		if (!IsWindowsVistaOrGreater()) {
			return OSVer::OS_WinXP;
		}

IsWindowsVistaOrGreater 関数 が True を返せばサービスパック適用なしの Windows Vista かそれ以降ということです。 False が返された場合は WinXP であると判断しています。

IsWindowsXPSP1OrGreater 関数 で WinXP SP1 以降かを、また同様の関数で WinXP SP2 以降か、あるいは WinXP SP3 以降かを判断可能ですが、省略しています

		//  Windows 7 より前なら Windows Vista です。
		if (!IsWindows7OrGreater()) {
			return OSVer::OS_WinVista;
		}

		//  Windows 8 より前なら Windows 7 です。
		if (!IsWindows8OrGreater()) {
			return OSVer::OS_Win7;
		}

同じように、サービスパック適用なしの Windows 7 より前なら WinVista と判断します。 IsWindowsVistaSP1OrGreater 関数 で WinVista SP1 以降かを、また同様の関数で WinVista SP2 以降かを判断可能ですが、省略しています

続けてサービスパック適用なしの Windows 8 より前なら Win7 と判断します。 IsWindows7SP1OrGreater 関数 で Win7 SP1 以降かどうかを判断可能ですが、省略しています


ここからが嫌なところです。

たとえプログラムが Windows 10 で動作していたとしても、 「アプリケーションのマニフェスト」を適切に設定していない場合は(デフォルトのままの場合は)、 Windows 8 と判断される仕様になっているようです。 詳細は 「IsWindows10OrGreater 関数」 の注釈の欄、および VerifyVersionInfoW 関数 の「例」の直前の段落にわかりやすく書かれています。

しかし実行するアプリケーションのマニフェストで指定してしまうと必ずしも正確に判断できない気がしますので次のように実装しましたが、 これではうまくいきませんでした。 なお、ここに来るのは Windows 8 以降の場合のみとなっています。

		if (IsWindowsVersionOrGreater(10, 0, 0)) {
			return OSVer::OS_Win10;
		}

実は各判定関数が内部で呼び出している IsWindowsVersionOrGreater 関数 で、Windows 10 を意味する、メジャーバージョン 10、マイナーバージョン 0、サービスパックなしか、それより新しいかを判断しようとしています。 この関数自体は、従来の GetVersionEx 関数と似ています。

しかしアプリケーションのマニフェストなしに正確に比較されることはありませんでした。 つまり、この IsWindowsVersionOrGreater 関数もマニフェストの影響を受け、 特に指定していない場合は Win8 である値と比較してしまうようです。

なんとか回避できないものでしょうか?

▲ページ先頭へ

判定関数の実装(Win8 以降)

投稿 January 13, 2023、追記 July 12, 2023

Windows 8 以降で OS を正しく判定できないか、試しました。

そしてどうやらレジストリの参照により、うまくいけそうな感じでした。 Win8、Win8.1 のテスト環境がありませんので、Win10 のみでテストしています。

レジストリエディタ regedit で確認すると、 HKEY_LOCAL_MACHINESOFTWARE\Microsoft\Windows NT\CurrentVersion に、OS に関する情報が詰まっているようです。

レジストリエディタ

ここにある CurrentMajorVersionNumber キーと CurrentMinorVersionNumber に、 従来の GetVersionEx 関数で取得していたような値が設定されているようでした。 あるいは文字列ですが、ProductName からでも良さそうです。

レジストリキー

このキーの値を読み出す内部使用関数を実装しています。

	/**
	*  レジストリからバージョン番号を取得します。
	*/
	bool COSVer::GetVerFromRegistry(int& nMajorVer, int& nMinorVer)
	{
		HKEY hKey;			// 開いているレジストリキーのハンドル
		DWORD dwType, dwValue;
		DWORD dwSize = sizeof(DWORD);

		// 値をクリアしておきます。
		nMajorVer = 0;
		nMinorVer = 0;

		// サブキーをオープンします。
		LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"), 0, KEY_READ, &hKey);
		if (lRet != ERROR_SUCCESS) {
			return false;
		}

RegOpenKeyEx 関数 で、CurrentMajorVersionNumber キーと CurrentMinorVersionNumber キーがある場所を開きます。

第 1 引数にルートキーを示すシンボル、第 2 引数に開きたいサブキーを渡します。 以降 0 は予約された値、KEY_READ はアクセスの目的、そしてハンドルを受け取るためのポインタです。 成功すると ERROR_SUCCESS が返されます。

		// メジャーバージョン値を取得します。
		if (RegQueryValueEx(hKey,_T("CurrentMajorVersionNumber"),NULL,&dwType,(BYTE*)&dwValue,&dwSize) != ERROR_SUCCESS) {
			RegCloseKey(hKey);
			return false;
		}
		nMajorVer = (int)dwValue;

		// マイナーバージョン値を取得します。
		if (RegQueryValueEx(hKey, _T("CurrentMinorVersionNumber"), NULL, &dwType, (BYTE*)&dwValue, &dwSize) != ERROR_SUCCESS) {
			RegCloseKey(hKey);
			return false;
		}
		nMinorVer = (int)dwValue;

		// サブキーを閉じます。
		RegCloseKey(hKey);
		return true;
	}

RegQueryValueEx 関数 で、キーの値を読み込めます。

第 1 引数に開いているサブキーのハンドル、第 2 引数にキー名を指定します。 以降 NULL は予約された値、指定した値に格納されているデータの型を示すコードを受け取る変数へのポインタ、値のデータを受け取るバッファーへのポインタ、 そしてバッファーのサイズをバイト単位で指定する変数へのポインタと続きます。

ERROR_SUCCESS 以外が返された場合はハンドルをクローズして false を返します。

いずれも DWORD 値ですが大きな値ではありませんので、引数で受け取った nMajorVer と nMinorVar に設定し、 ハンドルをクローズした後 true を返しています。


では、GetVer 関数でうまくいかなかった最後の判定部分を書き換えます。

		int nMajorVer, nMinorVer;
		if (!GetVerFromRegistry(nMajorVer, nMinorVer)) {
			return OSVer::OS_Unknown;
		}

今実装した、レジストリからバージョン番号を取得する GetVerFromRegistry 関数を呼び出します。 失敗した場合は値を取れていませんので、OS 判定は失敗です。

ちなみに Windows 7 では CurrentMajorVersionNumber キーなどがありませんでしたので、 これより前の判定部分をやめて GetVersionEx 関数代わりに使うことはできません

Win7 の CurrentVersion

		// Win10 かどうかを判断します(Win11 も該当する可能性があります)
		if (nMajorVer == 10 && nMinorVer == 0) {
			return OSVer::OS_Win10;
		}

得られたバージョン番号から、Windows 10 であるかどうかを判断しています。 Win10 であれば、メジャーバージョンが 10、マイナーバージョンが 0 となっているはずです。 これらの値は OSVERSIONINFOEXW structure の Remarks の欄に書かれていますが、 OS の判定方法が変わったからか、Windows 10 までしか書かれていません。

一致すれば Win10 と判断していますが、 この判定だけだと少なくとも Win10 からアップグレードした Win11 でも合致してしまっていますProductName キーも、「Windows 10 Home」のままになっています・・・。


		// Win8 かどうかを判断します。
		if (nMajorVer == 6 && nMinorVer == 2) {
			return OSVer::OS_Win8;
		}

		// Win8.1 かどうかを判断します。
		if (nMajorVer == 6 && nMinorVer == 3) {
			return OSVer::OS_Win81;
		}

		return OSVer::OS_Win8orLater;

同じように、Win8 であればメジャーバージョン 6、マイナーバージョン 2 です。 Win8.1 であればメジャーバージョン 6、マイナーバージョン 3 です。 どれでもない場合は、Windows 8 以降である、というところまでしかわかりません。

Win8 / Win8.1 の環境がありませんので、動作は未確認です。 判定が必要な場合は、正しく動作するかどうかを確認してください。


バージョン番号以外の方法では、どうやらダブリがない番号が付与されているビルド番号で比較する手もありそうですが、 小さいアップデートでも対応できなくなる可能性が高いので、良い感じはしません。

▲ページ先頭へ

判定関数の実装(Win11)

投稿 January 28, 2023、追記 July 12, 2023

Windows 10 Home からアップグレードした Windows 11 がどのようになっているか、確認しました。

Win10 と同じように レジストリエディタ regedit で確認すると、 HKEY_LOCAL_MACHINESOFTWARE\Microsoft\Windows NT\CurrentVersion にある情報は、なんだか想定と異なります

これでいけると思った CurrentMajorVersionNumber キーと CurrentMinorVersionNumber キーは、 それぞれ 10、0 であり、Windows 10 と変わりません。 ということは、これで判断することはできません。 クリーンインストールの場合はこれらのキーがない可能性もあるでしょう。

設定のシステムにある「バージョン情報」で表示される 「Windows の仕様」は、このような感じです。

Windows の仕様

エディション「Windows 11 Home」をどうやって判断しているのか、です。 Windows 11 になった Windows 10 Home のためなのでしょう、ProductName は Windows 10 Home となっています。 とりあえずはレジストリ HKEY_LOCAL_MACHINE を「Windows 11」でレジストリを検索してみると、 キーの Element にその文字列は見つかりましたが、利用方法はわかりません。 ヒットするのはこれだけです。

HKEY_LOCAL_MACHINE\BCD00000000\Objects\{79745XXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\Elements\12000004
※ X の部分は 16 進数の値で、念のため伏せています

Win10 PC で同キーを確認しましたが、79745 で始まるキーはありませんでした。 これが判断のもとになっている可能性がなくはありませんが、きっと違うだろうと感じます。

念のため HKEY_CURRENT_CONFIG などレジストリ全体を検索してみましたが、"Windows 11" という文字列は見つかりませんので、 これ以外にはないのでしょう。

"Home" で検索を試みましたが、関係ないものがあまりにもたくさんヒットするので途中断念です。

CurrentVersion も 6.3 のままですので、比較できません。


Windows 11 と特定する Microsoft からの公式の情報はないようですが、 ある程度信頼できそうな情報としては、 CurrentBuild(または CurrentBuildNumber ?) の値が 22000 より大きいの場合は Windows 11 と判断しても良さそうです。 アップグレード時の値は 22621 であり、半年ほど経過して更新プログラムなどを適用している今 2023 年 7 月でも同じ値になっていました。 Win10 Pro の場合は 19045 となっています。

Windows 10 の OS ビルド番号の最新情報は、 Windows 10 リリース情報 をスクロールさせた後半、 「Windows 10 のリリース履歴」に掲載されています。 2023 年 7 月現在の最大値は 19045 ですので、22000 を超える日は来ないと思います。

Windows 12 などがリリースされたときには、また判断の追加が必要になります(「Windows 11 以降」であることは保証されますが)。

他の可能性としては、 値が 1105 になっている UBR で「OS ビルド」を構成していますから、これで判断できるかもしれません。

あるいは値が 22H2 になっている DisplayVersion も使えるでしょうか? これは Win10 Pro でも同じ値でしたので、使えません。

本当に仕方なく、マイクロソフトが推奨している「その OS に固有の機能」があるかどうかを調べて判断・・・でしょうか。 Win10 になくて Win11 にある機能とは何か、を調べなくてはいけませんが。

▲ページ先頭へ

OS バージョンを文字列に変換する

投稿 January 13, 2023

特に必要はありませんが、画面に表示するには文字列で返してくれるほうが便利です。

	/**
	*  OS バージョン文字列を返します。
	*/
	LPCTSTR COSVer::GetVerString(int nVer)
	{
		switch (nVer) {

		case OSVer::OS_Win2000:
			return _T("Windows 2000");

		case OSVer::OS_WinXP:
			return _T("Windows XP");

		case OSVer::OS_Win7:
			return _T("Windows 7");

		case OSVer::OS_Win8orLater:
			return _T("Windows 8 or Later");

		case OSVer::OS_Win8:
			return _T("Windows 8");

		case OSVer::OS_Win81:
			return _T("Windows 8.1");

		case OSVer::OS_WinVista:
			return _T("Windows Vista");

		case OSVer::OS_Win10:
			return _T("Windows 10");

		case OSVer::OS_Win11:
			return _T("Windows 11");
		}
		return _T("Unknown");
	}

文字列は自由にしていただければ良いかと思います。

OS_Win11 は、Windows 11 の判定を行う場合に追加しています。

▲ページ先頭へ

32 ビットか 64 ビットかの判断

投稿 January 13, 2023

32 ビット Windows で動作しているか、それとも 64 ビット Windows で動作しているかを判断します。

32 ビット Windows で 64 ビットアプリは動作しませんが、64 ビット Windows では 32 ビットアプリも動作します。

	/**
	*  OS が 64 ビットかどうかを調べます。
	*    この実行ファイルが 32 ビット(x86 ビルド)でも 64 ビット(x64 ビルド)でも判断できます。
	*    ただし、AMD/Intel 以外のプロセッサでは正しく判定できないかもしれません。
	*/
	bool COSVer::IsOSx64(void)
	{
		BOOL bRet = FALSE;

		IsWow64Process(GetCurrentProcess(), &bRet);
		if (bRet) {
			//  32 ビットアプリが 64 ビット OS で動作している(WOW64 で動作中)ことが確定です。
			//    【確認済み】32 ビットアプリを 64 ビット Win10 で動作させた場合には、ここに分類されます。
			return true;
		}

まずは IsWow64Process 関数 で、今自分が「 WOW64 または x64 プロセッサの Intel64 で実行されているかどうかを判断」します。 WOW64 とは、64 ビット OS 上で 32 ビットアプリを動作させる機能のことです。

ソフトと OS の組み合わせと IsWow64Process 関数 の戻り値の関係は、次のようになっているようです。

64 ビットアプリ + 64 ビット OS → FALSE
64 ビットアプリ + 32 ビット OS → そもそも動作しない
32 ビットアプリ + 64 ビット OS → TRUE(WOW64)
32 ビットアプリ + 32 ビット OS → FALSE

まずこの関数が TRUE を返した場合、64 ビット OS で 32 ビットアプリとして動作しているケースしかありませんので、 64 ビット OS であると判断できます。

FALSE が返された場合は、 「64 ビットプログラムが 64 ビット OS で動作中」か、 「32 ビットプログラムが 32 ビット OS で動作中」のいずれかです。

		SYSTEM_INFO si;
		GetNativeSystemInfo(&si);

		switch (si.wProcessorArchitecture) {

		//  x64(AMD/Intel)
		//    【未確認】64 ビットアプリを 64 ビット OS で動作させた場合は、ここに分類されます。
		case PROCESSOR_ARCHITECTURE_AMD64:
			return true;				// 64 ビットプロセッサー

GetNativeSystemInfo 関数 で、システム情報を取得します。 この関数を使うには、シンボル _WIN32_WINNT が 0x0501 以降に設定されている必要があるようです。 VS2015 の場合は、sdkddkver.h で 0x0603 に設定されています。 VS2022 の場合も targetver.h を経由して sdkddkver.h がインクルードされるようになっていますので、確認してください。 なお、sdkddkver.h は共有のファイルですので、必要があってもこれを直接書き換えることは避けたほうがいいと思います。

SYSTEM_INFO 構造体wProcessorArchitecture で、 「インストールされているオペレーティング システムのプロセッサ アーキテクチャ」を知ることができます。

ちなみに Environment.Is64BitProcess も使えそうですが、このプロパティは .NET Framework がないと使用できません。

これが PROCESSOR_ARCHITECTURE_AMD64 の場合は、 AMD または Intel の 64 ビットーキテクチャだということです。 「32 bit OS を 64 bit CPU で使用中」にどうなるかの確認ができていませんが、 この場合は 64 bit OS と判断して、だいたい問題ないのではないかと思います。

		// ARM
		case PROCESSOR_ARCHITECTURE_ARM:

		// ARM64(VS2015 にはなく、VS2022 では定義されています)
#if 1
		case PROCESSOR_ARCHITECTURE_ARM64:
#endif

		// Intel Itanium-based
		case PROCESSOR_ARCHITECTURE_IA64:
			break;					// いずれも対象外

		//  x86
		//    32 ビットアプリが 32 ビットプロセッサで動作しています。
		//    【確認済み】32 ビットアプリを 32 ビット Win7 で動作させた場合には、ここに分類されます。
		//    【確認済み】32 ビットアプリを 32 ビット Win10 で動作させた場合には、ここに分類されます。
		case PROCESSOR_ARCHITECTURE_INTEL:
			break;

		// 不明
		case PROCESSOR_ARCHITECTURE_UNKNOWN:
		default:
			break;
		}
		return false;
	}

ARM、ARM64、IA64 の場合は、テストできませんので false を返すようにしています。 なお、ARM64 は、古い Visual Studio では定義されていませんので、ご注意ください。

32 ビットの AMD / Intel 系 CPU の場合は、そもそも CPU が 32 ビットですので、32 ビット OS しか動作しません。

ちょっと不足もありますが、ほぼ正確に判断できるかと思います。


以上をまとめると、呼び出し方はこんな感じです。

void CCheckOSVerDlg::OnBnClickedOk()
{
	nsSA::COSVer osVer;
	CString str;

	str.Format(_T("%s(%s)"), osVer.GetVerString(osVer.GetVer()), osVer.IsOSx64() ? _T("64ビット") : _T("32 ビット"));
	MessageBox(str);

	CDialogEx::OnOK();
}

CString クラスは、MFC の文字列操作クラスです。

▲ページ先頭へ

▼ 広告 ▼

line
関連トピックス
line

_sprintf でリンクエラーを回避する

古い Visual C++ プロジェクトから新しい環境に移行したとき、_sprintf でエラーが出る場合の回避方法について、書いています。

リストボックスの文字サイズやフォントを変える

Visual C++ では、リストボックスの文字サイズをプロパティで変更することはできません。 ここでは自由な文字サイズに変更したり、別のフォントにしたりしています。

マルチモニタを制御

Windows PC で 2 台のモニタを接続している場合、2 台接続を検出し、座標を特定するためのコードについて書いています。

VS Community 2022 をインストールする

すでにインストールされている VS 2019 をアンインストールし、VS Community 2022 をインストールしなおしています。

line
その他のおすすめ
line

Android 開発トップ

Android 開発関連の情報を、書いています。

Windows 開発トップ

Windows 開発関連の情報を、書いています。



© 2017-2023 StraightApps.com 無断転載を禁じます。No reproduction without permission.