2013-03-25 2 views
-1

Я пытаюсь определить Версию для Windows с использованием OSVERSIONINFOEX в Delphi XE2, как учебник, описанном в How to check in delphi the OS version? Windows 7 or Server 2008 R2? я определил следующие коды:версия Windows, используя OSVERSIONINFOEX

unit ApplicationWizard01; 

interface 

uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Registry; 

type 
    TMainForm = class(TForm) 
    BitBtn01: TBitBtn; 
    Memo01: TMemo; 
    procedure BitBtn01Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    MainForm: TMainForm; 

_OSVERSIONINFOEX : record 
    dwOSVersionInfoSize : DWORD; 
    dwMajorVersion  : DWORD; 
    dwMinorVersion  : DWORD; 
    dwBuildNumber  : DWORD; 
    dwPlatformId  : DWORD; 
    szCSDVersion  : array[0..127] of AnsiChar; 
    wServicePackMajor : WORD; 
    wServicePackMinor : WORD; 
    wSuiteMask   : WORD; 
    wProductType  : BYTE; 
    wReserved   : BYTE; 
    end; 
    TOSVERSIONINFOEX : _OSVERSIONINFOEX; 

    function GetVersionExA(var lpVersionInformation: TOSVersionInfoEX): BOOL; stdcall; external kernel32; 

const 
    VER_NT_WORKSTATION :Integer = 1; 
    VER_SUITE_ENTERPRISE :Integer = 2; 
    VER_NT_SERVER   :Integer = 3; 
    VER_SUITE_DATACENTER :Integer = 128; 
    VER_SUITE_PERSONAL :Integer = 512; 

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_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_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_STANDARD_SERVER    = $00000007; {Server Standard Edition (Full Installation)} 
    PRODUCT_STANDARD_SERVER_CORE   = $0000000D; {Server Standard Edition (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_UNLICENSED     = $ABCDABCD; {Unlicensed Product} 




implementation 

{$R *.dfm} 

var 
{$EXTERNALSYM GetProductInfo} 
    GetProductInfo: function (dwOSMajorVersion, dwOSMinorVersion, 
          dwSpMajorVersion, dwSpMinorVersion: DWORD; 
          var pdwReturnedProductType: DWORD): BOOL stdcall = NIL; 

function GetOSInfo: string; 
var 
    NTBres, BRes: Boolean; 
    OSVI: TOSVERSIONINFO; 
    OSVI_NT: TOSVERSIONINFOEX; 
    tmpStr: string; 
    dwOSMajorVersion, dwOSMinorVersion, 
    dwSpMajorVersion, dwSpMinorVersion, 
    pdwReturnedProductType : DWORD; 
begin 
    Result := 'Error'; 
    NTBRes := FALSE; 
    try 
    OSVI_NT.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFOEX); 
    NTBRes := GetVersionExA(OSVI_NT); 
    OSVI.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); 
    BRes := GetVersionEx(OSVI); 
    except 
    OSVI.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); 
    BRes := GetVersionEx(OSVI); 
    end; 
    if (not BRes) and (not NTBres) then 
    Exit; 
    Move(OSVI, OSVI_NT, SizeOf(TOSVersionInfo)); 

    case OSVI_NT.dwPlatformId of 
    VER_PLATFORM_WIN32_NT: 
     begin 
     if OSVI_NT.dwMajorVersion <= 4 then 
      Result := 'Windows NT '; 
     if (OSVI_NT.dwMajorVersion = 5) and (OSVI_NT.dwMinorVersion = 0) then 
      Result := 'Windows 2000 '; 
     if (OSVI_NT.dwMajorVersion = 5) and (OSVI_NT.dwMinorVersion = 1) then 
      Result := 'Windows XP '; 
     if (OSVI_NT.dwMajorVersion = 6) and (OSVI_NT.dwMinorVersion = 0) then 
     begin 
      Result := 'Windows Vista '; 
      if Assigned(GetProductInfo) then 
      begin 
      GetProductInfo(dwOSMajorVersion, dwOSMinorVersion, 
          dwSpMajorVersion, dwSpMinorVersion, 
          pdwReturnedProductType); 
      case pdwReturnedProductType of 
       PRODUCT_BUSINESS: 
       tmpStr := 'Business Edition'; 
       PRODUCT_BUSINESS_N: 
       tmpStr := 'Business Edition'; 
       PRODUCT_CLUSTER_SERVER: 
       tmpStr := 'Cluster Server Edition'; 
       PRODUCT_DATACENTER_SERVER: 
       tmpStr := 'Server Datacenter Edition (full installation)'; 
       PRODUCT_DATACENTER_SERVER_CORE: 
       tmpStr := 'Server Datacenter Edition (core installation)'; 
       PRODUCT_ENTERPRISE: 
       tmpStr := 'Enterprise Edition'; 
       PRODUCT_ENTERPRISE_N: 
       tmpStr := 'Enterprise Edition'; 
       PRODUCT_ENTERPRISE_SERVER: 
       tmpStr := 'Server Enterprise Edition (full installation)'; 
       PRODUCT_ENTERPRISE_SERVER_CORE: 
       tmpStr := 'Server Enterprise Edition (core installation)'; 
       PRODUCT_ENTERPRISE_SERVER_IA64: 
       tmpStr := 'Server Enterprise Edition for Itanium-based Systems'; 
       PRODUCT_HOME_BASIC: 
       tmpStr := 'Home Basic Edition'; 
       PRODUCT_HOME_BASIC_N: 
       tmpStr := 'Home Basic Edition'; 
       PRODUCT_HOME_PREMIUM: 
       tmpStr := 'Home Premium Edition'; 
       PRODUCT_HOME_PREMIUM_N: 
       tmpStr := 'Home Premium Edition'; 
       PRODUCT_HOME_SERVER: 
       tmpStr := 'Home Server Edition'; 
       PRODUCT_SERVER_FOR_SMALLBUSINESS: 
       tmpStr := 'Server for Small Business Edition'; 
       PRODUCT_SMALLBUSINESS_SERVER: 
       tmpStr := 'Small Business Server'; 
       PRODUCT_SMALLBUSINESS_SERVER_PREMIUM: 
       tmpStr := 'Small Business Server Premium Edition'; 
       PRODUCT_STANDARD_SERVER: 
       tmpStr := 'Server Standard Edition (full installation)'; 
       PRODUCT_STANDARD_SERVER_CORE: 
       tmpStr := 'Server Standard Edition (core installation)'; 
       PRODUCT_STARTER: 
       tmpStr := 'Starter Edition'; 
       PRODUCT_STORAGE_ENTERPRISE_SERVER: 
       tmpStr := 'Storage Server Enterprise Edition'; 
       PRODUCT_STORAGE_EXPRESS_SERVER: 
       tmpStr := 'Storage Server Express Edition'; 
       PRODUCT_STORAGE_STANDARD_SERVER: 
       tmpStr := 'Storage Server Standard Edition'; 
       PRODUCT_STORAGE_WORKGROUP_SERVER: 
       tmpStr := 'Storage Server Workgroup Edition'; 
       PRODUCT_UNDEFINED: 
       tmpStr := 'An unknown product'; 
       PRODUCT_ULTIMATE: 
       tmpStr := 'Ultimate Edition'; 
       PRODUCT_ULTIMATE_N: 
       tmpStr := 'Ultimate Edition'; 
       PRODUCT_WEB_SERVER: 
       tmpStr := 'Web Server Edition'; 
       PRODUCT_UNLICENSED: 
       tmpStr := 'Unlicensed product' 
      else 
       tmpStr := ''; 
      end;{ pdwReturnedProductType } 
      Result := Result + tmpStr; 
      NTBRes := FALSE; 
      end;{ GetProductInfo<>NIL } 
     end;{ Vista } 
     if NTBres then 
     begin 
      if OSVI_NT.wProductType = VER_NT_WORKSTATION then 
      begin 
      if OSVI_NT.wProductType = VER_NT_WORKSTATION then 
      begin 
       case OSVI_NT.wSuiteMask of 
       512: Result := Result + 'Personal'; 
       768: Result := Result + 'Home Premium'; 
       else 
       Result := Result + 'Professional'; 
       end; 
      end 
      else if OSVI_NT.wProductType = VER_NT_SERVER then 
      begin 
       if OSVI_NT.wSuiteMask = VER_SUITE_DATACENTER then 
       Result := Result + 'DataCenter Server' 
       else if OSVI_NT.wSuiteMask = VER_SUITE_ENTERPRISE then 
       Result := Result + 'Advanced Server' 
       else 
       Result := Result + 'Server'; 
      end; 
      end{ wProductType=VER_NT_WORKSTATION } 
      else 
      begin 
      with TRegistry.Create do 
       try 
       RootKey := HKEY_LOCAL_MACHINE; 
       if OpenKeyReadOnly('SYSTEM\CurrentControlSet\Control\ProductOptions') then 
        try 
        tmpStr := UpperCase(ReadString('ProductType')); 
        if tmpStr = 'WINNT' then 
         Result := Result + 'Workstation'; 
        if tmpStr = 'SERVERNT' then 
         Result := Result + 'Server'; 
        finally 
        CloseKey; 
        end; 
       finally 
       Free; 
       end; 
      end;{ wProductType<>VER_NT_WORKSTATION } 
      end;{ NTBRes } 
     end;{ VER_PLATFORM_WIN32_NT } 
    VER_PLATFORM_WIN32_WINDOWS: 
     begin 
     if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 0) then 
     begin 
      Result := 'Windows 95 '; 
      if OSVI.szCSDVersion[1] = 'C' then 
      Result := Result + 'OSR2'; 
     end; 
     if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 10) then 
     begin 
      Result := 'Windows 98 '; 
      if OSVI.szCSDVersion[1] = 'A' then 
      Result := Result + 'SE'; 
     end; 
     if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 90) then 
      Result := 'Windows Me'; 
     end;{ VER_PLATFORM_WIN32_WINDOWS } 
    VER_PLATFORM_WIN32s: 
     Result := 'Microsoft Win32s'; 
    else 
    Result := 'Unknown'; 
    end;{ OSVI_NT.dwPlatformId } 
end;{ GetOSInfo } 

procedure TMainForm.BitBtn01Click(Sender: TObject); 
begin 
    // 
end; 

initialization 
    @GetProductInfo := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 
            'GetProductInfo'); 

end. 

Но я получаю большое количество ошибок следующим образом:

[DCC Error] ApplicationWizard01.pas(36): E2007 Constant or type identifier expected 
[DCC Error] ApplicationWizard01.pas(38): E2005 'TOSVERSIONINFOEX' is not a type identifier 
[DCC Error] ApplicationWizard01.pas(96): E2007 Constant or type identifier expected 
[DCC Error] ApplicationWizard01.pas(105): E2066 Missing operator or semicolon 
[DCC Error] ApplicationWizard01.pas(117): E2029 'OF' expected but identifier 'dwPlatformId' found 
[DCC Error] ApplicationWizard01.pas(117): E2029 ',' or ':' expected but 'OF' found 
[DCC Error] ApplicationWizard01.pas(120): E2029 'THEN' expected but identifier 'dwMajorVersion' found 
[DCC Error] ApplicationWizard01.pas(122): E2029 ')' expected but identifier 'dwMajorVersion' found 
[DCC Error] ApplicationWizard01.pas(124): E2029 ')' expected but identifier 'dwMajorVersion' found 
[DCC Error] ApplicationWizard01.pas(126): E2029 ')' expected but identifier 'dwMajorVersion' found 
[DCC Error] ApplicationWizard01.pas(204): E2029 'THEN' expected but identifier 'wProductType' found 
[DCC Error] ApplicationWizard01.pas(206): E2029 'THEN' expected but identifier 'wProductType' found 
[DCC Error] ApplicationWizard01.pas(208): E2029 'OF' expected but identifier 'wSuiteMask' found 
[DCC Error] ApplicationWizard01.pas(208): E2029 ',' or ':' expected but 'OF' found 
[DCC Error] ApplicationWizard01.pas(215): E2029 'THEN' expected but identifier 'wProductType' found 
[DCC Error] ApplicationWizard01.pas(217): E2029 'THEN' expected but identifier 'wSuiteMask' found 
[DCC Error] ApplicationWizard01.pas(219): E2029 'THEN' expected but identifier 'wSuiteMask' found 
[DCC Error] ApplicationWizard01.pas(246): E2029 ':=' expected but ':' found 
[DCC Error] ApplicationWizard01.pas(247): E2029 Expression expected but 'BEGIN' found 
[DCC Error] ApplicationWizard01.pas(263): E2029 ':=' expected but ':' found 
[DCC Error] ApplicationWizard01.pas(264): E2010 Incompatible types: 'Integer' and 'string' 
[DCC Error] ApplicationWizard01.pas(270): E2070 Unknown directive: 'TMainForm' 
[DCC Error] ApplicationWizard01.pas(275): E2029 Statement expected but 'INITIALIZATION' found 
[DCC Error] ApplicationWizard01.pas(275): E2029 ';' expected but 'INITIALIZATION' found 
[DCC Error] ApplicationWizard01.pas(13): E2065 Unsatisfied forward or external declaration: 'TMainForm.BitBtn01Click' 
[DCC Fatal Error] ApplicationWizard.dpr(5): F2063 Could not compile used unit 'ApplicationWizard01.pas' 
+0

Недопустимо ключевое слово 'type' перед строкой с' _OSVERSIONINFOEX'. – TLama

+0

Я добавил «тип», но ошибка находится в строке «_OSVERSIONINFOEX: record» как «E2029» = «ожидается, но»: «найден» и «szCSDVersion: array [0..127] of AnsiChar;» строка как «E2029» = «ожидается, но»: «найден». Пожалуйста, помогите мне. –

+1

А, я вижу. Вы как-то скопировали это неправильно. Это не имеет значения, вам не нужны все те типы и константы, которые у вас уже определены в блоке 'Winapi.Windows.pas'. – TLama

ответ

1

Ваша проблема заключается в том, что вы не скопировали код из ответа @ Ken. Нам нет смысла пытаться отладить ошибки транскрипции, которые вы сделали. Правильное решение - правильно использовать код из ответа. Поскольку @Ken дал вам полную единицу, просто используйте это. Убедитесь, что вы используете буфер обмена. Выберите весь блок и вставьте его в пустое окно редактора. Затем сохраните его в файле с именем GetWinVersionInfo.pas.

Если вам нужно отредактировать этот код, я бы, вероятно, удалил все объявления, которые теперь можно найти в блоке Windows. Это позволяет избежать путаницы, имея только одну копию этих вещей. Например, типы и константы могут, я думаю, все удаляться.

+0

Я думаю, вы говорите, что, как «TOSVersion» переводится в «System.SysUtils», «TOSVersionInfoEx» переводится в «Winapi.Windows». Если да, то как его реализовать. –

+0

Да, это правильно. Не могли бы вы рассказать нам, для чего вы хотите использовать этот код? –

+0

Я хочу, чтобы этот код в первую очередь показывал версию Windows. Во-вторых, если ОС - Vista Ultimate или Seven Ultimate, будут включены только некоторые кнопки, и моя программа будет работать. –

Смежные вопросы