-1

Delphi XE2 で OSVERSIONINFOEX を使用して Windows バージョンを特定しようとしています。Windows 7 または Server 2008 R2? 次のコードを定義しました。

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'
4

1 に答える 1

1

問題は、@Ken の回答からコードをコピーしなかったことです。あなたが犯した転記ミスを私たちがデバッグしようとしても意味がありません。正しい解決策は、回答のコードを正しく使用することです。@Ken が完全なユニットを提供したので、それを使用してください。必ずクリップボードを使用してください。ユニット全体を選択し、空のエディター ウィンドウに貼り付けます。という名前のファイルに保存しますGetWinVersionInfo.pas

そのコードを編集する必要がある場合は、おそらく Windows ユニットにあるすべての宣言を削除します。これらのコピーを 1 つだけ持つことで、混乱を避けることができます。たとえば、型と定数はすべて削除できると思います。

于 2013-03-25T15:42:10.223 に答える