精确判断vista版本

Under Windows Vista (and only Windows Vista, remerber my previous article  http://www.delphi3000.com/articles/article_5145.asp), I can call the GetProductInfo Windows Vista API function that inform me what kind of Windows Vista Edition is running.

I've found all needed description on how to call this Windows API function on the MSDN site (http://msdn2.microsoft.com/en-us/library/ms724358.aspx)

In my delphi code, all I need to do is to be sure that my application is running under Vista otherwise, by calling an external function that doesn't exist in KERNEL32.DLL, I could see a crash in my application.

My choice has been to define a new type like

  TGetProductInfoAPI = function(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion: DWORD; pdwReturnedProductType: PDWORD): BOOL stdcall;

with an equivalent function by declaring

  function _GetProductInfoAPI(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion: DWORD; pdwReturnedProductType: PDWORD): BOOL; stdcall;

I can declare a global variable of this type and initialize it by this line

var
  GetProductInfoAPI: TGetProductInfoAPI = _GetProductInfoAPI;

This initialization is very important !

The _GetProductInfoAPI function has the responsability to call the external Windows Vista API function GetProductInfo only if my delphi code runs under Vista. Otherwise, it returns False.

This function is defined by

function _GetProductInfoAPI(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion: DWORD; pdwReturnedProductType: PDWORD): BOOL;
var
  pFunction: Pointer;
begin
  pFunction := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 'GetProductInfo');
  if  Assigned(pFunction) then
  begin
    @GetProductInfoAPI := pFunction;
    Result := GetProductInfoAPI(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion, pdwReturnedProductType);
  end
  else
    Result := False;
end;

The entry function will be :

function GetVistaProductInfoStr(var AVistaEdition: String): Boolean;

By calling it you will retrieve the Vista edition in AVistaEdition variable if it returns True.

The usage is :

...

uses uVistaOS;  // the complete code is following

...

procedure TForm1.Button1Click(Sender: TObject);
var
  sVistaName: String;
begin
  if uVistaOS.GetVistaProductInfoStr(sVistaName) then
    Caption := sVistaName
  else
    Caption := 'No Vista Name';
    // At this level, you can call the GetVersionEx function
    // to retrieve the right Windows version (XP, Win2000...)
end;


Here is the uVistaOS.pas code. You'll retrieve the IsVista function that defined in a previous article.

===================================================================
unit uVistaOS;

interface

uses Windows;

type
  TGetProductInfoAPI = function(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion: DWORD; pdwReturnedProductType: PDWORD): BOOL stdcall;
  function _GetProductInfoAPI(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion: DWORD; pdwReturnedProductType: PDWORD): BOOL; stdcall;

  function GetVistaProductInfoStr(var AVistaEdition: String): Boolean;
  function IsVista: Boolean;
  
var
  GetProductInfoAPI: TGetProductInfoAPI = _GetProductInfoAPI;

implementation

uses SysUtils, Variants;

const
  PRODUCT_BUSINESS                         = $00000006; {Business Edition}
  PRODUCT_BUSINESS_N                       = $00000010; {Business Edition}
  PRODUCT_CLUSTER_SERVER                   = $00000012; {Cluster Server Edition}
  PRODUCT_DATACENTER_SERVER                = $00000008; {Server Datacenter Edition (full installation)}
  PRODUCT_DATACENTER_SERVER_CORE           = $0000000C; {Server Datacenter Edition (core installation)}
  PRODUCT_DATACENTER_SERVER_CORE_V         = $00000027; {Server Datacenter Edition without Hyper-V (core installation)}
  PRODUCT_DATACENTER_SERVER_V              = $00000025; {Server Datacenter Edition without Hyper-V (full installation)}
  PRODUCT_ENTERPRISE                       = $00000004; {Enterprise Edition}
  PRODUCT_ENTERPRISE_N                     = $0000001B; {Enterprise Edition}
  PRODUCT_ENTERPRISE_SERVER                = $0000000A; {Server Enterprise Edition (full installation)}
  PRODUCT_ENTERPRISE_SERVER_CORE           = $0000000E; {Server Enterprise Edition (core installation)}
  PRODUCT_ENTERPRISE_SERVER_V              = $00000026; {Server Enterprise Edition without Hyper-V (full installation)}
  PRODUCT_ENTERPRISE_SERVER_CORE_V         = $00000029; {Server Enterprise Edition without Hyper-V (core installation)}
  PRODUCT_ENTERPRISE_SERVER_IA64           = $0000000F; {Server Enterprise Edition for Itanium-based Systems}
  PRODUCT_HOME_BASIC                       = $00000002; {Home Basic Edition}
  PRODUCT_HOME_BASIC_N                     = $00000005; {Home Basic Edition}
  PRODUCT_HOME_PREMIUM                     = $00000003; {Home Premium Edition}
  PRODUCT_HOME_PREMIUM_N                   = $0000001A; {Home Premium Edition}
  PRODUCT_HOME_SERVER                      = $00000013; {Home Server Edition}
  PRODUCT_SERVER_FOR_SMALLBUSINESS         = $00000018; {Server for Small Business Edition}
  PRODUCT_SMALLBUSINESS_SERVER             = $00000009; {Small Business Server}
  PRODUCT_SMALLBUSINESS_SERVER_PREMIUM     = $00000019; {Small Business Server Premium Edition}
  PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT = $0000001E; {Windows Essential Business Server Management Server}
  PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING  = $00000020; {Windows Essential Business Server Messaging Server}
  PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY   = $0000001F; {Windows Essential Business Server Security Server}
  PRODUCT_STANDARD_SERVER                  = $00000007; {Server Standard Edition (full installation)}
  PRODUCT_STANDARD_SERVER_V                = $00000024; {Server Standard Edition without Hyper-V (full installation)}
  PRODUCT_STANDARD_SERVER_CORE             = $0000000D; {Server Standard Edition (core installation)}
  PRODUCT_STANDARD_SERVER_CORE_V           = $00000028; {Server Standard Edition without Hyper-V (core installation)}
  PRODUCT_STARTER                          = $0000000B; {Starter Edition}
  PRODUCT_STORAGE_ENTERPRISE_SERVER        = $00000017; {Storage Server Enterprise Edition}
  PRODUCT_STORAGE_EXPRESS_SERVER           = $00000014; {Storage Server Express Edition}
  PRODUCT_STORAGE_STANDARD_SERVER          = $00000015; {Storage Server Standard Edition}
  PRODUCT_STORAGE_WORKGROUP_SERVER         = $00000016; {Storage Server Workgroup Edition}
  PRODUCT_UNDEFINED                        = $00000000; {An unknown product}
  PRODUCT_ULTIMATE                         = $00000001; {Ultimate Edition}
  PRODUCT_ULTIMATE_N                       = $0000001C; {Ultimate Edition}
  PRODUCT_WEB_SERVER                       = $00000011; {Web Server Edition}
  PRODUCT_WEB_SERVER_CORE                  = $0000001D; {Web Server Edition (core installation)}
  PRODUCT_UNLICENSED                       = $ABCDABCD; {Unlicensed product}

function IsVista: Boolean;
var
  pFunction: Pointer;
begin
  pFunction := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 'GetProductInfo');
  Result := Assigned(pFunction);
end;

function _GetProductInfoAPI(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion: DWORD; pdwReturnedProductType: PDWORD): BOOL;
var
  pFunction: Pointer;
begin
  pFunction := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 'GetProductInfo');
  if  Assigned(pFunction) then
  begin
    @GetProductInfoAPI := pFunction;
    Result := GetProductInfoAPI(dwOSMajorVersion, dwOSMinorVersion, dwSpMajorVersion, dwSpMinorVersion, pdwReturnedProductType);
  end
  else
    Result := False;
end;

function GetVistaProductInfoStr(var AVistaEdition: String): Boolean;
const
  CVistaEdition = 'Windows Vista (%s)';
var
  dwReturnedProductType: DWORD;
begin
  Result := GetProductInfoAPI(6, 0, 0, 0, @dwReturnedProductType);
  if Result then
  begin
    case dwReturnedProductType of
      PRODUCT_BUSINESS                         : AVistaEdition := 'Business Edition';
      PRODUCT_BUSINESS_N                       : AVistaEdition := 'Business Edition';
      PRODUCT_CLUSTER_SERVER                   : AVistaEdition := 'Cluster Server Edition';
      PRODUCT_DATACENTER_SERVER                : AVistaEdition := 'Server Datacenter Edition (full installation)';
      PRODUCT_DATACENTER_SERVER_CORE           : AVistaEdition := 'Server Datacenter Edition (core installation)';
      PRODUCT_DATACENTER_SERVER_CORE_V         : AVistaEdition := 'Server Datacenter Edition without Hyper-V (core installation)';
      PRODUCT_DATACENTER_SERVER_V              : AVistaEdition := 'Server Datacenter Edition without Hyper-V (full installation)';
      PRODUCT_ENTERPRISE                       : AVistaEdition := 'Enterprise Edition';
      PRODUCT_ENTERPRISE_N                     : AVistaEdition := 'Enterprise Edition';
      PRODUCT_ENTERPRISE_SERVER                : AVistaEdition := 'Server Enterprise Edition (full installation)';
      PRODUCT_ENTERPRISE_SERVER_CORE           : AVistaEdition := 'Server Enterprise Edition (core installation)';
      PRODUCT_ENTERPRISE_SERVER_V              : AVistaEdition := 'Server Enterprise Edition without Hyper-V (full installation)';
      PRODUCT_ENTERPRISE_SERVER_CORE_V         : AVistaEdition := 'Server Enterprise Edition without Hyper-V (core installation)';
      PRODUCT_ENTERPRISE_SERVER_IA64           : AVistaEdition := 'Server Enterprise Edition for Itanium-based Systems';
      PRODUCT_HOME_BASIC                       : AVistaEdition := 'Home Basic Edition';
      PRODUCT_HOME_BASIC_N                     : AVistaEdition := 'Home Basic Edition';
      PRODUCT_HOME_PREMIUM                     : AVistaEdition := 'Home Premium Edition';
      PRODUCT_HOME_PREMIUM_N                   : AVistaEdition := 'Home Premium Edition';
      PRODUCT_HOME_SERVER                      : AVistaEdition := 'Home Server Edition';
      PRODUCT_SERVER_FOR_SMALLBUSINESS         : AVistaEdition := 'Server for Small Business Edition';
      PRODUCT_SMALLBUSINESS_SERVER             : AVistaEdition := 'Small Business Server';
      PRODUCT_SMALLBUSINESS_SERVER_PREMIUM     : AVistaEdition := 'Small Business Server Premium Edition';
      PRODUCT_MEDIUMBUSINESS_SERVER_MANAGEMENT : AVistaEdition := 'Windows Essential Business Server Management Server';
      PRODUCT_MEDIUMBUSINESS_SERVER_MESSAGING  : AVistaEdition := 'Windows Essential Business Server Messaging Server';
      PRODUCT_MEDIUMBUSINESS_SERVER_SECURITY   : AVistaEdition := 'Windows Essential Business Server Security Server';
      PRODUCT_STANDARD_SERVER                  : AVistaEdition := 'Server Standard Edition (full installation)';
      PRODUCT_STANDARD_SERVER_V                : AVistaEdition := 'Server Standard Edition without Hyper-V (full installation)';
      PRODUCT_STANDARD_SERVER_CORE             : AVistaEdition := 'Server Standard Edition (core installation)';
      PRODUCT_STANDARD_SERVER_CORE_V           : AVistaEdition := 'Server Standard Edition without Hyper-V (core installation)';
      PRODUCT_STARTER                          : AVistaEdition := 'Starter Edition';
      PRODUCT_STORAGE_ENTERPRISE_SERVER        : AVistaEdition := 'Storage Server Enterprise Edition';
      PRODUCT_STORAGE_EXPRESS_SERVER           : AVistaEdition := 'Storage Server Express Edition';
      PRODUCT_STORAGE_STANDARD_SERVER          : AVistaEdition := 'Storage Server Standard Edition';
      PRODUCT_STORAGE_WORKGROUP_SERVER         : AVistaEdition := 'Storage Server Workgroup Edition';
      PRODUCT_UNDEFINED                        : AVistaEdition := 'An unknown product';
      PRODUCT_ULTIMATE                         : AVistaEdition := 'Ultimate Edition';
      PRODUCT_ULTIMATE_N                       : AVistaEdition := 'Ultimate Edition';
      PRODUCT_WEB_SERVER                       : AVistaEdition := 'Web Server Edition';
      PRODUCT_WEB_SERVER_CORE                  : AVistaEdition := 'Web Server Edition (core installation)';
      PRODUCT_UNLICENSED                       : AVistaEdition := 'Unlicensed product';
    end;
    AVistaEdition := Format(CVistaEdition, [AVistaEdition]);
  end;
end;

end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值