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;
}
