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