Windows Vistaのエディション名を取得する

Windows Vistaのエディションを取得するにはGetProductInfoを利用すると楽にできる。ただしこのAPIはWindows Vista以降に備わるものなので、そのまま利用すると実行ファイルをWindows 2000で動かせなくなる。そのためLoadLibrary、GetProcAddressを利用して実行時に呼び出すようにした方がいい。

また、GetProductInfoで取得できた値が「PRODUCT_ULTIMATE」だからと言って「Windows Vista Ultimate Edition」とは限らない。今後Windows Vistaの後継OSが出た時もこのAPIが使われることが考えられるためだ。そのため「Windows Vista Ultimate Edition」としたい場合は、GetVersionExで取得したWindowsのメジャーバージョンおよびマイナーバージョンをもチェックするといい。

「PRODUCT_ULTIMATE」などが定義されていないというエラーが出てビルドできない場合は、Windows SDKがきちんとインストールされているかを確認すること。

ちなみに各プロダクトタイプはwinnt.hの中で以下のように定義されている。
//
// Product types
// This list grows with each OS release.
//
// There is no ordering of values to ensure callers
// do an equality test i.e. greater-than and less-than
// comparisons are not useful.
//
// NOTE: Values in this list should never be deleted.
//       When a product-type 'X' gets dropped from a
//       OS release onwards, the value of 'X' continues
//       to be used in the mapping table of GetProductInfo.
//

#define PRODUCT_UNDEFINED                       0x00000000

#define PRODUCT_ULTIMATE                        0x00000001
#define PRODUCT_HOME_BASIC                      0x00000002
#define PRODUCT_HOME_PREMIUM                    0x00000003
#define PRODUCT_ENTERPRISE                      0x00000004
#define PRODUCT_HOME_BASIC_N                    0x00000005
#define PRODUCT_BUSINESS                        0x00000006
#define PRODUCT_STANDARD_SERVER                 0x00000007
#define PRODUCT_DATACENTER_SERVER               0x00000008
#define PRODUCT_SMALLBUSINESS_SERVER            0x00000009
#define PRODUCT_ENTERPRISE_SERVER               0x0000000A
#define PRODUCT_STARTER                         0x0000000B
#define PRODUCT_DATACENTER_SERVER_CORE          0x0000000C
#define PRODUCT_STANDARD_SERVER_CORE            0x0000000D
#define PRODUCT_ENTERPRISE_SERVER_CORE          0x0000000E
#define PRODUCT_ENTERPRISE_SERVER_IA64          0x0000000F
#define PRODUCT_BUSINESS_N                      0x00000010
#define PRODUCT_WEB_SERVER                      0x00000011
#define PRODUCT_CLUSTER_SERVER                  0x00000012
#define PRODUCT_HOME_SERVER                     0x00000013
#define PRODUCT_STORAGE_EXPRESS_SERVER          0x00000014
#define PRODUCT_STORAGE_STANDARD_SERVER         0x00000015
#define PRODUCT_STORAGE_WORKGROUP_SERVER        0x00000016
#define PRODUCT_STORAGE_ENTERPRISE_SERVER       0x00000017
#define PRODUCT_SERVER_FOR_SMALLBUSINESS        0x00000018
#define PRODUCT_SMALLBUSINESS_SERVER_PREMIUM    0x00000019

#define PRODUCT_UNLICENSED                      0xABCDABCD

依存環境:ATL
#include "atlstr.h"



bool	Test(void)
{
	HMODULE	hModule;
	BOOL	ret;
	DWORD	dwType;
	CAtlString	strMessage;

	BOOL (CALLBACK* pfnGetProductInfo)(DWORD dwOSMajorVersion,DWORD dwOSMinorVersion,DWORD dwSpMajorVersion,DWORD dwSpMinorVersion,PDWORD pdwReturnedProductType);

	hModule = ::LoadLibrary(_T("kernel32.dll"));
	if(hModule == NULL)
		return	false;

	(*(FARPROC*)&pfnGetProductInfo) = ::GetProcAddress(hModule,"GetProductInfo");

	ret = FALSE;
	if(pfnGetProductInfo)
	{
		OSVERSIONINFOEX	sInfoEx;

		::ZeroMemory(&sInfoEx,sizeof(OSVERSIONINFOEX));
		sInfoEx.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
		ret = ::GetVersionEx((LPOSVERSIONINFO)&sInfoEx);

		if(ret)
			ret = pfnGetProductInfo(sInfoEx.dwMajorVersion,sInfoEx.dwMinorVersion,sInfoEx.wServicePackMajor,sInfoEx.wServicePackMinor,&dwType);
	}

	if(ret)
	{
		switch(dwType)
		{
		case	PRODUCT_ULTIMATE:
			strMessage = _T("PRODUCT_ULTIMATE");
			break;

		case	PRODUCT_HOME_BASIC:
			strMessage = _T("PRODUCT_HOME_BASIC");
			break;

		case	PRODUCT_HOME_PREMIUM:
			strMessage = _T("PRODUCT_HOME_PREMIUM");
			break;

		case	PRODUCT_ENTERPRISE:
			strMessage = _T("PRODUCT_ENTERPRISE");
			break;

		case	PRODUCT_HOME_BASIC_N:
			strMessage = _T("PRODUCT_HOME_BASIC_N");
			break;

		case	PRODUCT_BUSINESS:
			strMessage = _T("PRODUCT_BUSINESS");
			break;

		case	PRODUCT_STANDARD_SERVER:
			strMessage = _T("PRODUCT_STANDARD_SERVER");
			break;

		case	PRODUCT_DATACENTER_SERVER:
			strMessage = _T("PRODUCT_DATACENTER_SERVER");
			break;

		case	PRODUCT_SMALLBUSINESS_SERVER:
			strMessage = _T("PRODUCT_SMALLBUSINESS_SERVER");
			break;

		case	PRODUCT_ENTERPRISE_SERVER:
			strMessage = _T("PRODUCT_ENTERPRISE_SERVER");
			break;

		case	PRODUCT_STARTER:
			strMessage = _T("PRODUCT_STARTER");
			break;

		case	PRODUCT_DATACENTER_SERVER_CORE:
			strMessage = _T("PRODUCT_DATACENTER_SERVER_CORE");
			break;

		case	PRODUCT_STANDARD_SERVER_CORE:
			strMessage = _T("PRODUCT_STANDARD_SERVER_CORE");
			break;

		case	PRODUCT_ENTERPRISE_SERVER_CORE:
			strMessage = _T("PRODUCT_ENTERPRISE_SERVER_CORE");
			break;

		case	PRODUCT_ENTERPRISE_SERVER_IA64:
			strMessage = _T("PRODUCT_ENTERPRISE_SERVER_IA64");
			break;

		case	PRODUCT_BUSINESS_N:
			strMessage = _T("PRODUCT_BUSINESS_N");
			break;

		case	PRODUCT_WEB_SERVER:
			strMessage = _T("PRODUCT_WEB_SERVER");
			break;

		case	PRODUCT_CLUSTER_SERVER:
			strMessage = _T("PRODUCT_CLUSTER_SERVER");
			break;

		case	PRODUCT_HOME_SERVER:
			strMessage = _T("PRODUCT_HOME_SERVER");
			break;

		case	PRODUCT_STORAGE_EXPRESS_SERVER:
			strMessage = _T("PRODUCT_STORAGE_EXPRESS_SERVER");
			break;

		case	PRODUCT_STORAGE_STANDARD_SERVER:
			strMessage = _T("PRODUCT_STORAGE_STANDARD_SERVER");
			break;

		case	PRODUCT_STORAGE_WORKGROUP_SERVER:
			strMessage = _T("PRODUCT_STORAGE_WORKGROUP_SERVER");
			break;

		case	PRODUCT_STORAGE_ENTERPRISE_SERVER:
			strMessage = _T("PRODUCT_STORAGE_ENTERPRISE_SERVER");
			break;

		case	PRODUCT_SERVER_FOR_SMALLBUSINESS:
			strMessage = _T("PRODUCT_SERVER_FOR_SMALLBUSINESS");
			break;

		case	PRODUCT_SMALLBUSINESS_SERVER_PREMIUM:
			strMessage = _T("PRODUCT_SMALLBUSINESS_SERVER_PREMIUM");
			break;

		case	PRODUCT_UNLICENSED:
			strMessage = _T("PRODUCT_UNLICENSED");
			break;

		default:
			strMessage.Format(_T("Unknown Type(%d)"),dwType);
		}
	}

	::FreeLibrary(hModule);

	::MessageBox(NULL,strMessage,_T(""),MB_OK);

	return	true;
}

プロジェクトファイルをダウンロード


カテゴリー「システム情報」 のエントリー